天天看点

(设计模式)Singleton和Double-Checked Locking模式

模式摘要

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模式

}