1.模式设计的动机和定义
思考:
如何保证一个类只有一个实例并且这个实例易于被访问?
- 使用全局变量:可以确保对象随时可以被访问,但不能防止创建多个对象
- 让类自身负责创建和保存它的唯一实例,并保证不能通过其他方法创建实例,同时提供一个访问该实例的方法
模式定义
确保一个类只有一个实例,并提供一个全局访问点来访问这个唯一实例。
它属于对象创建型模式。
要点:
- 某个类只能有一个实例
- 必须自行创建这个实例
- 必须自行向整个系统提供这个实例
2.简单工厂模式的模式结构
3.模式特点
- 私有构造函数
- 静态私有成员变量(自身类型)
- 静态公有的工厂方法
实现范例
两种实现形式:
- 饿汉式 (Eager Singleton)
代码:
public class EagerSingleton {
private static final EagerSingleton instance = new EagerSingleton();
private EagerSingleton() { }
public static EagerSingleton getInstance() {
return instance;
}
}
- 懒汉式
线程不安全的懒汉式
public class LazySingleton {
private static LazySingleton instance = null;
private LazySingleton() { }
public static LazySingleton getInstance() {
if (instance == null) {
instance = new LazySingleton();
}
return instance;
}
}
线程安全的懒汉式 (Double-Check Locking)
package creatorPatternHomework.singleton;
public class LazySingleton {
...
public static LazySingleton getInstance() {
// 外面这个判断其实是去掉也可以避免重复新建对象,
// 但添加了这个判断以使当已经创建了对象后不必进行上锁,提高获取instance的效率
if (instance == null) {
synchronized (LazySingleton.class) {
if (instance == null) {
instance = new LazySingleton();
}
}
}
return instance;
}
}
两种实现方式的比较:
- 饿汉式单例类:无须考虑多个线程同时访问的问题;调用速度和反应时间优于懒汉式单例;资源利用效率不及懒汉式单例;系统加载时间可能会比较长
- 懒汉式单例类:实现了延迟加载;必须处理好多个线程同时访问的问题;需通过双重检查锁定等机制进行控制,将导致系统性能受到一定影响