Java设计模式之单例模式(SingletonPattern)
1、单例模式的定义:确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类叫做单例类,它提供全局访问的方法。单例模式是一种对象创建型模式。
2、单例模式的结构:
(1)单例类只能有一个实例;
(2)单例类必须自行创建这个实例;
(3)单例类向客户端提供访问实例的方法。
3、饿汉式单例
package EagerSingleton;
public class EagerSingleton {
private static EagerSingleton st = new EagerSingleton();//类加载的时候就创建单例类对象
private EagerSingleton() {//单例的模式的核心,使构造方法变为私有,外部类就不能通过构造方法创建对象
}
public static EagerSingleton getInstance() {//定义一个公有的类方法,给外部类访问该类
return st;
}
}
4、懒汉式单例
package LazySingleton;
public class LazySingleton {
private static LazySingleton lst;//类加载的时候并没有创建单例类对象,而是在调用对象方法的时候再去创建
private LazySingleton(){}//同样,要使构造方法变为私有,防止外部类创建对象
public static LazySingleton getInstance() {//类方法,判断该对象是否创建,没有则创建,有创建过则直接返回该对象
if(lst == null){
lst = new LazySingleton();
}
return lst;
}
}
5、客户端代码
import EagerSingleton.EagerSingleton;
import LazySingleton.LazySingleton;
public class Client {
public static void main(String[] args) {
EagerSingleton s1 = EagerSingleton.getInstance();
EagerSingleton s2 = EagerSingleton.getInstance();
System.out.println(s1);
System.out.println(s2);
LazySingleton s3 = LazySingleton.getInstance();
LazySingleton s4 = LazySingleton.getInstance();
System.out.println(s3);
System.out.println(s4);
}
}
6、单例模式适用场景
(1)系统只需要一个实例对象,如系统要求提供一个唯一的序列号生成器或资源管理器,或者需要考虑资源消耗太大而只允许创建一个对象。
(2)客户调用类的单个实例只允许使用一个公共的访问点,除了该公共访问点,不能再通过其他方法访问该实例。