模式摘要
PS:紫色和蓝色的字为原书的话
《设计模式解析》一书中提到的建筑师Christopher Alexander对模式的定义:“在某一背景下某个问题的一种解决方案!”。它说,一个模式的描述应该包括:
- 模式的名称
- 模式的目的,即要解决的问题
- 实现方法
- 为了实现该模式我们必须考虑的限制和约束因素
Singleton模式和Double-Checked Locking模式
模式的名称:Singleton & Double-Checked Locking
模式的目的:保证一个类仅有一个实例,并提供一下访问它的全局访问点。即,希望对象只有一个实例,但没有控制对象实例化的全局对象。还希望确保所有实体使用该对象相同的实例,而无需将引用传给它们。
实现:
- 添加一个类的私有的静态成员变量,引用所需的对象(初值为null)。
- 添加一个公共的静态方法,它在成员变量的值为null时实例化这个类(并设置成员变量的值),然后返回该成员变量的值。
- 将构造方法的状态设置为保护或私有,从而访止任何人直接实例化这个类,绕过静态构造方法机制。
代码示例:项目中,如果有一个系统的工厂类,或者是数据库工厂类,通常这个工厂模式中会用到单件模式(Singleton)
代码一(JAVA - Singleton):单线程
(设计模式)Singleton和Double-Checked Locking模式
(设计模式)Singleton和Double-Checked Locking模式 public class SimpleFactory ... {
(设计模式)Singleton和Double-Checked Locking模式 private static SimpleFactory factory = null;
(设计模式)Singleton和Double-Checked Locking模式
(设计模式)Singleton和Double-Checked Locking模式 private SimpleFactory() ...{
(设计模式)Singleton和Double-Checked Locking模式 }
(设计模式)Singleton和Double-Checked Locking模式
(设计模式)Singleton和Double-Checked Locking模式 public static SimpleFactory getInstance() ...{
(设计模式)Singleton和Double-Checked Locking模式 if(factory == null)
(设计模式)Singleton和Double-Checked Locking模式 factory = new SimpleFactory();
(设计模式)Singleton和Double-Checked Locking模式 return factory;
(设计模式)Singleton和Double-Checked Locking模式 }
(设计模式)Singleton和Double-Checked Locking模式 }
代码二(JAVA - Singleton):多线程1(设计模式解析中推荐)
(设计模式)Singleton和Double-Checked Locking模式
(设计模式)Singleton和Double-Checked Locking模式 public class SimpleFactory ... {
(设计模式)Singleton和Double-Checked Locking模式
(设计模式)Singleton和Double-Checked Locking模式
(设计模式)Singleton和Double-Checked Locking模式 private SimpleFactory() ...{
(设计模式)Singleton和Double-Checked Locking模式 }
(设计模式)Singleton和Double-Checked Locking模式
(设计模式)Singleton和Double-Checked Locking模式
(设计模式)Singleton和Double-Checked Locking模式 public static SimpleFactory getInstance() ...{
(设计模式)Singleton和Double-Checked Locking模式 return Factory.factory;
(设计模式)Singleton和Double-Checked Locking模式 }
(设计模式)Singleton和Double-Checked Locking模式
(设计模式)Singleton和Double-Checked Locking模式
(设计模式)Singleton和Double-Checked Locking模式
(设计模式)Singleton和Double-Checked Locking模式
(设计模式)Singleton和Double-Checked Locking模式 private static class Factory ...{
(设计模式)Singleton和Double-Checked Locking模式 static final SimpleFactory factory = new SimpleFactory();
(设计模式)Singleton和Double-Checked Locking模式 }
(设计模式)Singleton和Double-Checked Locking模式 }
代码三(JAVA - Double-Checked Locking):多线程2
(设计模式)Singleton和Double-Checked Locking模式
(设计模式)Singleton和Double-Checked Locking模式 public class SimpleFactory ... {
(设计模式)Singleton和Double-Checked Locking模式 private static SimpleFactory factory = null;
(设计模式)Singleton和Double-Checked Locking模式
(设计模式)Singleton和Double-Checked Locking模式 private SimpleFactory() ...{
(设计模式)Singleton和Double-Checked Locking模式 }
(设计模式)Singleton和Double-Checked Locking模式
(设计模式)Singleton和Double-Checked Locking模式 public static SimpleFactory getInstance() ...{
(设计模式)Singleton和Double-Checked Locking模式
(设计模式)Singleton和Double-Checked Locking模式 if (factory == null) ...{
(设计模式)Singleton和Double-Checked Locking模式
(设计模式)Singleton和Double-Checked Locking模式 synchronized(this) ...{
(设计模式)Singleton和Double-Checked Locking模式
(设计模式)Singleton和Double-Checked Locking模式 if (factory == null) ...{
(设计模式)Singleton和Double-Checked Locking模式 factory = new SimpleFactory();
(设计模式)Singleton和Double-Checked Locking模式 }
(设计模式)Singleton和Double-Checked Locking模式 }
(设计模式)Singleton和Double-Checked Locking模式 }
(设计模式)Singleton和Double-Checked Locking模式 return factory;
(设计模式)Singleton和Double-Checked Locking模式 }
(设计模式)Singleton和Double-Checked Locking模式 }
调用都是一致的
(设计模式)Singleton和Double-Checked Locking模式
(设计模式)Singleton和Double-Checked Locking模式 public static void main(String[] args) ... {
(设计模式)Singleton和Double-Checked Locking模式 SimpleFactory factory = SimpleFactory.getInstance();
(设计模式)Singleton和Double-Checked Locking模式 }