【软件设计模式】单例模式

单例模式

前言

​ 一句话总结:所谓的单例模式,就是设计一个类,它在整个程序中只能有一个该类的实例存在,这就是单例模式。

​ 就比如PPT窗口可以打开多个,任务管理器只能开一个。我们希望在Window运行时最多只能有一个任务管理器。

意图:确保一个类只能有一个实例,且提供对该实例的全局访问。
问题:几个不同的客户对象需要引用同一个对象,而且希望确保这种类型的对象数目不超过一个。

public class MyClass {
    private static MyClass uniqueInstance;

    // 其他成员变量声明
    private MyClass() {… }
	//方法设置为static,它不依赖自身实体对象。
    public static MyClass getInstance() {
        if (uniqueInstance == null)
            uniqueInstance = new MyClass();
        return uniqueInstance;
    }
    // 其他成员方法声明
}

​ 以上代码给予了我们另外一种实例化一个对象的方法(不通过new,而是通过类的静态方法getInstance获得唯一单例)

​ 单例模式一般有两种实现模式

​ 饿汉模式:像一个饿汉一样,不管需不需要用到实例都要去创建实例,即在类产生的时候就创建好实例,这是一种空间换时间的做法。作为一个饿汉而言,体现了它的本质——“我全都要”。

​ 懒汉模式:像一个懒汉一样,需要用到创建实例了程序再去创建实例,不需要创建实例程序就“懒得”去创建实例,这是一种时间换空间的做法,这体现了“懒汉的本性”。

饿汉模式

​ 饿汉模式的对象在类产生时候就创建了,一直到程序结束才会去释放。即作为一个单例类实例,它的生存周期和我们的程序一样长。因此该实例对象肯定需要使用static来修饰,因为类内部的static成员是不属于每个对象的,而是属于整个类的。在加载类的时候,我们的实例对象就产生了。所以对于饿汉模式而言,是线程安全的,因为在线程创建之前实例已经被创建好了

//类EagerSingleton在加载时就马上将自己实例化。
//可以解决多线程的问题

public class EagerSingleton {
    private static final EagerSingleton uniqueInstance = new EagerSingleton();
    //构造函数为私有,也就是该类无法在其他类中实例化
    private EagerSingleton() {…} 

    public static EagerSingleton getInstance() {
        return uniqueInstance;
    }
}

懒汉模式

//类LazySingleton只在第一次被引用时才实例化,静态加载该类并不会将他自己实例化。
public class LazySingleton {
    private static LazySingleton uniqueInstance;

    // 其他成员变量声明
    private LazySingleton() {…} 

    public static LazySingleton getInstance() {
        if (uniqueInstance == null)
            uniqueInstance = new LazySingleton();
        return uniqueInstance;
    }
    // 其他成员方法声明
}

饿汉模式与懒汉模式比较

​ 饿汉式单例类在自己被加载时就将自己实例化。单从资源利用效率角度来讲,比懒汉式单例类稍差些。从速度和反应时间角度来讲,则比懒汉式单例类稍好些。

​ 懒汉式单例类在实例化时,必须处理好在多个线程同时首次引用此类时的访问限制问题,特别是当单例类作为资源控制器,在实例化时必然涉及资源初始化,而资源初始化很有可能耗费大量时间,这意味着出现多线程同时首次引用此类的机率变得较大,需要通过同步化机制进行控制。

参考连接

https://blog.csdn.net/lvyibin890/article/details/81943637

https://blog.csdn.net/u014088294/article/details/50061073

老师的PPT

posted @ 2021-06-10 14:42  吃土poQAQ  阅读(51)  评论(0编辑  收藏  举报