`

创建型模式--单例模式(Singleton)

阅读更多

 Singleton:Ensure a class only has one instance, and provide a global point of access to it.

一个类只能有一个实例的创建模式。

一:引入

 在某些情况下一个类只能有一个实例,如果多于一个实例就会导致逻辑错误。

  • 非共享资源:如打印机,系统属性文件
  • 其他:如数据库主键生成器,只能有一个地方分配,否则会出现重复主键
  1. EagerSingleton(饿汉式单例):  
/** *//**
 * 饿汉式单例
 
*/

public class EagerSingleton ...{
    
//类加载时实例化
    private  static final EagerSingleton instance=new EagerSingleton();
    
//构造函数设为私有,不能以new的方式生成新的实例
    private EagerSingleton()
    
...{        
    }

    
//提供给客户的得到唯一实例的方法
    public static EagerSingleton getInstance()
    
...{
         
return instance;
    }

}
 

 

public class Client ...{
      
public static void main(String args[])
      
...{
          EagerSingleton s1 
= EagerSingleton.getInstance();
          EagerSingleton s2 
= EagerSingleton.getInstance();

        
if( s1 == s2 )
          System.out.println( 
"s1 == s2" );
      }

}

问题:

  • 类在加载时就将自己实例化,对于象资源控制器之类的类初始化可能耗费很多时间。还可能会导致出现多线程首次同时引用子类的几率变得比较大。
  • 构造函数为私有,不能被继承。
  1. LazySingleton(懒汉式单例)--延迟加载(访问时加载)
/** *//**
 * 懒汉式单例
 
*/

public class LazySingleton ...{
    
//类加载时为null,不实例化
    private  static  LazySingleton instance=null;
    
//构造函数设为私有,不能以new的方式生成新的实例
    private LazySingleton()
    
...{        
    }

    
//提供给客户的得到唯一实例的方法
    public static LazySingleton getInstance()
    
...{
        
//如果没有创建实例就创建,否则就用以前创建了的那个。
        if (instance==null) instance=new LazySingleton();
         
return instance;
    }

}
  • 第一次访问时实例化,资源利用效率比饿汉式要好,但第一次访问时反应时间不如饿汉式。
  • 因为构造函数私有,也不能被继承。

上例没有考虑到多线程环境,如果第一个线程执行到 if(instance==null)且还没有执行instance=new LazySingleton()时,另一个线程也执行到 if(instance==null)这时条件也为true,所以也会执行new LazySingleton()导致多实例。

 

//整个方法都加锁,防止多线程环境下的问题
    synchronized public static LazySingleton getInstance()
    
...{
        
//如果没有创建实例就创建,否则就用以前创建了的那个。
        if (instance==null) instance=new LazySingleton();
         
return instance;
    }

 

/** *//**
 * 懒汉式单例,多线程环境
 
*/

public class LazySingleton ...{
    
// 类加载时为null,不实例化.
    
// volatile ensures that multiple threads handle the instance variable
    
// correctly
    
// when it is being initialized to the Singleton instance.
    private volatile static LazySingleton instance = null;

    
// 构造函数设为私有,不能以new的方式生成新的实例
    private LazySingleton() ...{
    }


    
// 两阶段加锁,防止多线程环境下的问题,效率比整个方法加锁高。
    public static LazySingleton getInstance() ...{
        
// 如果没有创建实例就创建,否则就用以前创建了的那个。
        if (instance == null...{
            
synchronized (LazySingleton.class...{
                
if (instance == null...{
                    instance 
= new LazySingleton();
                }

            }

        }

        
return instance;
    }

}

 

二:结构

    

三:实际应用

  1. java.lang.Runtime
public class Runtime ...{
    
private static Runtime currentRuntime = new Runtime();

    
/** *//**
     * Returns the runtime object associated with the current Java application.
     * Most of the methods of class <code>Runtime</code> are instance 
     * methods and must be invoked with respect to the current runtime object. 
     * 
     * 
@return  the <code>Runtime</code> object associated with the current
     *          Java application.
     
*/

    
public static Runtime getRuntime() ...
    
return currentRuntime;
    }


    
/** *//** Don't let anyone else instantiate this class */
    
private Runtime() ...{}
}

 

 

四:适用情形

Use the Singleton pattern when

参考文献:
1:阎宏,《Java与模式》,电子工业出版社
2:Eric Freeman & Elisabeth Freeman,《Head First Design Pattern》,O'REILLY

  

评论

相关推荐

    c++-设计模式之单例模式(Singleton Pattern)

    单例模式(Singleton Pattern)是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点。这种模式常用于需要全局共享资源的场景,比如配置管理、日志记录等。 单例模式的组成 私有构造函数:防止外部...

    创建型模式之单例模式(Singleton Pattern)

    单例模式是软件设计模式中的一种,属于创建型模式,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下都非常有用,例如管理共享资源、配置对象或者缓存服务等。 单例模式的核心...

    C++设计模式-工厂和单例

    **定义**:单例模式是一种创建型设计模式,它保证一个类只有一个实例,并提供一个全局访问点。这种模式常用于资源管理,比如数据库连接、线程池或日志服务等,确保在整个应用中只存在一个共享的对象。 **实现**:在...

    Java设计模式-单例模式详解

    Java设计模式-单例模式详解 单例模式是 Java 设计模式中的一种常用的设计模式,旨在保证一个类仅有一个实例,并提供一个访问它的全局访问点。单例模式的目的是为了保证在一个进程中,某个类有且仅有一个实例。 ...

    设计模式总结-模板设计模式,单例模式(singleTon)

    ### 设计模式总结:模板设计模式与单例模式 #### 模板设计模式 模板设计模式是一种行为型设计模式,它定义了一个算法的骨架,并允许子类为算法的某些步骤提供具体的实现。通过这种方式,算法的基本流程保持不变,...

    单例模式 Singleton Pattern

    单例模式是一种常见的设计模式,属于创建型模式之一。这种模式的核心在于确保某个类只有一个实例存在,并且提供一个全局访问点来获取该实例。单例模式在Java开发中尤其常见,因为它能够帮助开发者控制对象的创建过程...

    C++实现Singleton单例模式

    单例模式是一种创建型模式,它可以确保一个类只能实例化一次,并提供一个全局访问点来访问这个实例。 单例模式的优点: 1. 确保一个类只能实例化一次,避免了资源浪费。 2. 提供一个全局访问点来访问这个实例,方便...

    Singleton(单例模式)

    在Java应用中,单例对象能保证在一个...3、有些像交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全乱了,只有使用单例模式,才能保证核心交易服务器独立控制整个流程。 CSDN代码的详细解释。

    设计模式-单例模式

    单例模式是一种广泛应用于软件设计中的创建型设计模式,它的核心思想是确保一个类只有一个实例,并提供一个全局访问点。这样做的好处在于控制共享资源的访问,比如线程安全的数据库连接池或者配置管理等。 在Java中...

    Python 程序语言设计模式思路-创建型模式:单例模式,确保一个类的唯一实例(装饰器)面向对象编程、继承

    单例模式(Singleton Pattern)作为创建型模式中的一种,旨在确保一个类在系统中只有一个实例,并提供全局访问点。

    设计模式——策略模式 & 单例模式

    单例模式是一种创建型设计模式,它保证一个类只有一个实例,并提供一个全局访问点。这样做的好处在于,当系统只需要一个共享资源时,可以避免多次实例化导致的资源浪费,同时方便对这个唯一实例进行控制和管理。 ...

    js代码-单例单例单例单例

    在JavaScript编程中,"单例模式"是一种设计模式,它保证了类只有一个实例,并提供一个全局访问点。这种模式在JavaScript中的应用广泛,特别是在大型应用和模块化开发中,用于管理资源、创建复杂的对象结构或者确保...

    java设计模式-单例.pdf

    单例模式是设计模式中的一个重要组成部分,属于创建型模式之一。其主要作用是确保某个类仅有一个实例存在,并提供一个全局访问该实例的方法。这在很多场景中都是非常有用的,比如日志对象、配置管理器、线程池等。 ...

    设计模式-单例设计模式

    单例模式是一种常见的创建型设计模式,其核心思想在于确保一个类仅有一个实例存在,并且该实例由该类自行创建,随后向整个系统提供这一唯一实例。 #### 类图解析 在设计模式中,类图是一种直观展示类结构及关系的...

    c++设计模式-单例模式

    **单例模式**是软件设计模式中的一种,属于创建型模式。在C++中,单例模式确保一个类只有一个实例,并提供一个全局访问点。这种模式通常用于管理共享资源,如数据库连接、日志系统或者配置文件等。单例模式的主要...

    设计模式_创建型_单例模式.md

    单例模式是软件设计模式中的一种,属于创建型模式。单例模式的目的是确保一个类在任何时候都只有一个实例,并且提供一个全局访问点给外部程序使用。 ## 单例模式的定义 单例模式是一种常用的软件设计模式,通过单例...

    PyPI 官网下载 | dask-actor-singleton-1.1.0.tar.gz

    综上所述,`dask-actor-singleton-1.1.0.tar.gz`是一个与Dask相关的Python软件包,它针对分布式系统中的单例模式进行了优化,可能整合了Zookeeper来实现更高级别的协调,同时也符合云原生的开发原则。如果你在处理...

    Laravel开发-singleton-pattern

    单例模式是一种创建型设计模式,它限制类的实例化过程,只允许类的一个实例存在。在Laravel中,我们可以通过服务容器来实现单例模式,服务容器是Laravel的核心组件,它负责管理应用程序中的依赖关系。 实现单例模式...

    Example-TypeScript-Singleton-Pattern:TypeScript 和单例模式

    单例模式是一种创建型设计模式,它限制类的实例化过程,使得在整个应用程序中只能存在一个类实例。这样可以节省资源,特别是在处理全局共享资源时非常有用。 3. **在 TypeScript 中实现单例**: - **私有构造函数...

Global site tag (gtag.js) - Google Analytics