创建型模式——1单例模式

声明:设计模式系列笔记摘自http://c.biancheng.net/view/1317.html

定义:一个类只有一个实例,且该类能自行创建这个实例。

image.png

特点:1.只能有一个实例;
2.该单例对象必须自行创建;
3.对外提供一个访问该单例的全局访问点。

应用场景特点:
1.某类只需要生成一个对象时;
2.对象需要被共享,由于单例模式只允许创建一个对象,共享该对象可以节省内存,并加快对象访问速度。如 Web 中的配置对象、数据库的连接池等。
3.当某类需要被频繁实例化并且频繁被销毁时,如线程池、网络连接池

例子一:
懒汉单例,该模式的特点是类加载时没有生成单例,只有当第一次调用 getlnstance 方法时才去创建这个单例。

public class LazySingleton {
    public static volatile LazySingleton instance = null; //保证 instance 在所有线程中同步
    private LazySingleton(){} //private 避免类在外部被实例化
    public static synchronized LazySingleton getInstance(){
        if(instance == null){
            instance = new LazySingleton();
        }
        return instance;
    }
}

当在另一个类中new LazySingleton 时,会发生编译错误The constructor LazySingleton() is not visible,因为LazySingleton 的构造函数是private私有的,因此不能new LazySingleton,只能通过getInstance方法来获取实例。

需要注意的是,如果编写的是多线程程序,则不要删除上例代码中的关键字 volatile 和 synchronized,否则将存在线程非安全的问题。如果不删除这两个关键字就能保证线程安全,但是每次访问时都要同步,会影响性能,且消耗更多的资源,这是懒汉式单例的缺点。

例子二:
饿汗单例,该模式的特点是类一旦加载就创建一个单例,保证在调用 getInstance 方法之前单例已经存在了。

public class HungarySingleton {
    private static final HungarySingleton instance = new HungarySingleton();
    private HungarySingleton(){}
    public HungarySingleton getInstance(){
        return instance;
    }
}

你可能感兴趣的:(创建型模式——1单例模式)