`
心若吾心
  • 浏览: 19086 次
  • 性别: Icon_minigender_2
社区版块
存档分类
最新评论

设计优化之单例模式设计

阅读更多

论设计模式的重要性:

目前已有多种流行的设计模式,这些都是针对某一种问题的成熟的解决方案。合理使用设计模式,不仅易于理解所设计的系统,也能使系统结构更加合理。以下是几种常见的设计模式及举例。

 

一、单例模式

简介:单例模式是是设计模式中使用最为普遍的模式之一,它是一种用于对象创建的模式,用来产生一个新的对象,单例,顾名思义就是确保系统中一个类只产生一个实例。

 

优点:对于一些频繁使用又是重量级的对象,只创建实例一次的这种行为省下了大量创建对象花费的时间,而且节约了系统开销;我们都知道java的垃圾回收,对于“new”的次数减少,减轻了垃圾回收的压力,改善了系统性能。

 

实例:单例模式的参与者分为单例类和使用者。单例类提供单例的工厂,返回单例;使用者获取并使用单例。

一个简单的单例实现:

public class Singleton{

private static Singleton instance=new Singleton();
private Singleton(){//private访问级别的构造函数
System.out.println("Singleton is created");
}

public static Singleton getInstance(){
return instance;
}
}

 

单例类中的private级别构造函数保证了单例不会再系统中其他非单例类代码中被实例化。以上单例实现简单,但是有不足之处,就是不能对instance实例做延迟加载。如果此单例的创建过程缓慢,由于instance变量是static的,因此在JVM加载单例类时单例对象就会被建立。如果此时这个单例类在系统中还扮演其他角色,那么在任何使用这个单例类的地方都会初始化这个单例变量,比如以下代码:

public class Singleton{

private static Singleton instance=new Singleton();

private Singleton(){
System.out.println("Singleton is created");
}

public static Singleton getInstance(){
return instance;
}

public static void test(){
System.out.println("just test");
}
} 

 执行Singleton.test();

输出结果:Singleton is created

               just test

如此可见,此时并不需要使用单例类但是单例类的确被实例化了。为了解决这个问题,引入了延迟加载机制。

public class LazySingleton(){
private static LazySingleton instance=null;

private LazySingleton(){
System.out.println("LazySingleton is created");
}

public static synchonized LazySingleton getInstance(){
if(instance==null){
instance=new LazySingleton();
}
return instance;
}

}

 以上代码对于instance的初始值为null,确保启动系统时没有额外的负载。在getInstance方法中,对instance实例化时要先进行判断,当instance为null时才对其创建。而且对于getInstance方法要进行方法的同步,否则在多线程环境下,在线程1正在新建单例完成new操作之前线程2发现instance仍然为null时,线程2也将新建单例,就会导致多个实例被创建。

虽然延迟加载功能实现了,但是同步关键字的使用大大增加了耗时。童鞋们可以对以上两种单例创建模式亲自测试一下耗时。

为了解决耗时的问题,又进行了如下的改造:

public class StaticSingleton{

private StaticSingleton{
System.out.println("StaticSingleton is created");
}

private static class SingletonHolder{
private static StaticSingleton instance=new StaticSingleton();
} 

public static StaticSingleton getInstance(){
return SingletonHolder.instance;
}

}

 

以上代码中,StaticSingleton被加载时其内部类并不会被初始化,所以instance并不会被实例化,直到getInstance方法被调用时才会加载SingleHolder类,由于实例化是在类加载时完成,故对多线程友好,也不需要同步关键字。

0
0
分享到:
评论

相关推荐

    设计模式之单例模式(结合工厂模式)

    单例模式是软件设计模式中的一种经典模式,它保证了类只有一个实例存在,并提供一个全局访问点。在Java等面向对象编程语言中,单例模式常用于管理共享资源,如数据库连接池、线程池或者配置文件等。结合工厂模式,...

    23钟设计模式之单例模式

    总结来说,单例模式在Java中的实现涉及到多线程同步、内存模型以及性能优化等多个方面。理解并熟练掌握各种单例模式的实现方式,有助于我们编写出更加健壮、高效的代码。同时,设计模式的应用不仅仅局限于单例,还有...

    设计模式——单例模式

    为了解决懒汉式单例模式的性能问题,有几种优化策略: 1. **双检锁/双重校验锁(DCL,即 double-checked locking)** ```java public class Singleton { private volatile static Singleton instance; private ...

    java设计模式之单例模式详解

    Java设计模式之单例模式详解 一、单例模式概览 单例模式(Singleton Pattern)是面向对象设计模式中的一种,属于创建型模式。它确保一个类仅有一个实例,并提供一个全局访问点来访问该实例。单例模式的核心在于控制...

    01 设计模式之单例模式.pdf

    双重检查锁定是一种优化懒汉式单例模式的写法,它可以在多线程环境中保证实例的唯一性,同时避免不必要的同步开销。通过在声明实例变量时加上volatile关键字,可以确保在读取该变量时不会发生指令重排序,从而保证了...

    php设计模式之单例模式_.docx

    ### PHP设计模式之单例模式详解 #### 一、引言 在软件工程领域,设计模式是一种被广泛接受的解决方案,用于解决特定类型的问题。PHP作为一种流行的服务器端脚本语言,同样可以从这些设计模式中受益。本文将详细介绍...

    JAVA设计模式之单例模式

    单例模式是软件设计模式中的一种经典模式,它在Java编程中被广泛使用,尤其是在需要控制实例化过程,或者确保某类只有一个实例时。本文将深入探讨Java中的单例模式,帮助你理解其原理和应用。 单例模式的核心思想是...

    三种工厂设计模式和两种单例模式

    在本文中,我们将深入探讨三种工厂设计模式——简单工厂模式、抽象工厂模式和工厂方法模式,以及两种单例模式——饿汉单例模式和懒汉单例模式。这些模式都是面向对象设计中的重要组成部分,对于理解和构建可维护、可...

    单例设计模式的优缺点和设计思想

    1. **内存优化**:由于单例模式保证了在内存中只有一个实例,这极大地减少了内存的开销,特别是在资源有限的环境中,这种优势尤为明显。 2. **性能提升**:单例模式通过避免重复实例化同一对象,减少了性能上的开销...

    java 设计模式 mvc模式 单例模式 代理 工厂 简单工厂 第二部分

    本篇将深入探讨标题中提及的几种设计模式:Model-View-Controller(MVC)模式、单例模式、代理模式以及工厂模式,尤其是简单工厂模式。 **1. Model-View-Controller (MVC) 模式** MVC模式是一种架构模式,它将应用...

    php设计模式之单例模式实例分析_.docx

    单例模式是软件设计模式中的一种,它的核心思想是确保一个类只有一个实例,并提供一个全局访问点。在PHP中,单例模式常用于控制数据库连接、缓存管理、日志记录等场景,以减少资源消耗并提高代码的可维护性。 在PHP...

    设计模式之单例模式(AS3实现)

    单例模式是软件设计模式中的一种...总结来说,单例模式在AS3中的实现并不复杂,但其设计理念对于优化资源管理和提高代码复用性有着重要作用。了解和熟练运用单例模式,可以帮助开发者编写出更高效、更易于维护的代码。

    PHP5设计模式-单例模式

    **PHP5设计模式 - 单例模式** 单例模式是一种常用的设计模式,它在软件工程中扮演着控制类实例化过程的角色,...在实际开发中,应根据项目的具体需求权衡是否使用,以及如何优化单例模式以适应不断变化的软件需求。

    深入理解JavaScript系列(25):设计模式之单例模式详解

    单例模式是软件开发中一种非常重要的设计模式,它确保一个类只有一个实例,并提供一个全局访问点。在JavaScript这样的动态语言中,单例模式的实现方式很多样,而且可以非常灵活。下面,我们就来深入探讨单例模式在...

    java设计优化之单例模式

    【Java设计优化之单例模式详解】 单例模式是一种经典的软件设计模式,它限制一个类只能有一个实例,常用于管理共享资源或者全局配置。在Java中,单例模式的实现方式多种多样,每种方式都有其特点和适用场景。下面...

    单例模式详解~~单例模式详解~~

    单例模式是一种设计模式,它的主要目标是确保一个类只有一个实例,并提供一个全局访问点。在软件工程中,单例模式常用于控制资源的共享,比如数据库连接池、线程池或者日志系统等,这些资源通常需要全局唯一且高效地...

    单例模式.zip(c#设计模式)

    单例模式是软件设计模式中的一...这些习题可能涉及如何实现和优化上述不同类型的单例模式,以及在特定场景下选择哪种实现方式更合适。通过解答这些问题,你可以深入理解单例模式的原理,掌握其在实际项目中的应用技巧。

    设计模式_单例模式.zip

    单例模式是软件设计中的一种常见模式,它的主要目的是确保一个类只有一个实例,并提供全局访问点。这样的设计在很多场景下都非常有用,比如配置管理、线程池、缓存服务等,因为这些服务通常只需要一个实例来协调整个...

    单例模式(singleton)

    总结来说,单例模式是一种重要的设计模式,用于控制类实例的数量,以优化资源管理和提高效率。在实际开发中,我们需要根据具体需求选择合适的实现方式,同时注意线程安全问题,确保单例模式的正确性和稳定性。

Global site tag (gtag.js) - Google Analytics