设计模式————单件模式

为什么使用单件模式?

有一些对象我们只需要一个,比方说:线程池、缓存等等,如果同时实例化了多个对象反而会出现一些问题。

对于这种类,仅靠程序员凭照约定不实例化,显然是不可靠的。 

尝试:创建一个类,把所有的方法和变量都设置成静态的,把类直接当做一个单件使用。

问题:因为静态初始化的控制权是在java手上,这么做可能导致混乱,特别是当有许多类牵涉其中的时候。

尝试:使用全局变量代替单件模式。

问题:在Java中,全局变量基本上就是对对象的静态引用。缺点一,急切实例化VS延迟实例化。缺点二,不能确保只有一个实例。

什么是单件模式?

定义:确保一个类只有一个实例,并提供一个全局访问点。

怎么用单件模式?

将构造器设置为private,即只有类本身才能调用自己的构造函数;

为类设置一个静态方法getInstance()来创建或获取这个实例。

处理多线程:

方法一:同步getInstance()方法,直接给该方法添加synchronize关键字即可

适用情况:getInstance()方法不被频繁运行,或性能不是很关键。

方法二:急切实例化,即在静态初始化器中创建单件,能够保证线程安全

public class Singleton{
    private static Singleton uniqueInstance=new Singleton();
    private Singleton(){}
    
    public static Singleton getInstance(){
        return uniqueInstance;
    }
)

适用情况:应用总是创建单件,适用单件很频繁

方法三:双重检查加锁

public class Singleton{
    private volatile static Singleton uniqueInstance;//必须有volatile关键字,确保初始化成实例时,多个线程正确地处理该变量
    private Singleton(){}
    
    public static Singleton getInstance(){
        if(uniqueInstance==null){
            synchronized(Singleton.class){
                if(uniqueInstance==null){
                     uniqueInstance=new Singleton();
                }
             }
        }
        return uniqueInstance;
    }
)

适用变量:java5以后可以使用,性能很好。

猜你喜欢

转载自my.oschina.net/u/3786691/blog/1809195
今日推荐