创建型设计模式

一、创建型模式解决的问题和实现方式 

创建型模式要解决的主要问题就是类的使用者和类实例的创建(new 操作)之间的耦合关系。就是说如何让类的使用者,在代码中不用去直接new一个对象。这样,在被使用的类需要变化时,使用者的代码不需要变化或者只需要做很小的变化。这里说的类的变化,是有条件的,比如从A变到B,它们之间需要有共同的抽象才行,用代码来说——他们要有共同的接口。任何问题领域,一定有东西是在变化的,也一定有东西是稳定的。我们要做的就是把稳定的东西和变化的东西分开,让变化的部分的变化不会导致稳定的部分也需要变化,用接口来隔离变化。

二、各个模式的解释 

1、单件模式

意图:保证一个类只有一个实例,并提供一个访问该实例的方式。下面是常见的实现代码: 

 1 Class DemoClass
 2 {
 3     private Object LockObj = new Object();
 4     private DemoClass instance;
 5     
 6     private DemoClass()
 7     { }
 8     
 9     public static DemoClass GetInstance()
10     {
11         if(instance == null)
12         {
13             lock(LockObj)
14             {
15                 if(instance == null)
16                 {
17                     instance = new DemoClass();
18                 }
19             }
20         }
21         
22         return instance;
23     }
24 }

这里解释一下为什么在多线程环境下,需要第15行的这个是否为空的判断。 

假设有两个线程A、B访问这段代码,并且实例还没有被创建过。

1、刚开始instance为null,假设线程A、B同时执行到第13行。

2、此时A线程获得CPU时间开始往下执行,B线程则在这里等待。 

3、A线程一路往下执行,创建好instance,并返回,此时线程A结束,CPU时间交给线程B。

4、由于线程A结束,线程B得到锁,不用再等了,往下执行第15行,因为此时instance已经被线程A创建了,如果这里没有是否为空的判断,那么instance将会被重新创建一次。 

2、工厂方法模式

意图:提供一个创建对象的接口,让类的实例化延迟到子类。

分析:重点就在与这个创建对象的接口,它只有一个Create方法,这个方法的工作很简单,就是去new一个对象而已,只不过这个工作是让这个接口的子类去做的。客户代码依赖于这个接口(或者说依赖于这个Create方法)和具体产品的IProduct接口去工作。

结构图如下: 

                      

3、创建者模式

意图:将一个复杂对象的构建过程和它的表示分离,使得同样的构建过程可以创建不同的表示。

分析:这里的重点在于对象构建过程的稳定,也就是说创建一个对象的步骤是定下来的,但是各个具体步骤会不同。 解决方法就是把各个需要变化的步骤,抽象成一个接口,然后构建过程根据这个接口的实例去构建,而不用关心这些步骤的具体实现。

结构图如下: 

                               

上面的这个Director其实可以不需要,对象的这个构建过程也可以放到客户代码里面去,这个无所谓。它的存在会让结构更松散一些而已。 

4、抽象工厂模式

意图:提供一个创建一系列相关或者相互依赖的对象的接口,而不用去关心它们的具体实现。

分析:抽象工厂模式与工厂方法模式的使用的方法非常相似,都是提供一个创建对象的接口,让具体对象的创建延迟到这个接口的子类。不同的是,工厂方法创建的是一个对象,创建的是某种类型的单个对象。而抽象工厂创建的是一系列的对象,这些对象是有一定的关联或者依赖关系的,对于下图来说就是A1、B1、C1、D1(或者A2、B2、C2、D2)之间有一定的联系,这些对象是一组有关系的对象,各自不是完全孤立的。

结构图如下: 

                           

5、原型模式

意图:通过原型实例指定创建对象的种类,然后通过拷贝原型对象来创建新的实例。

分析:实现方式和结构都比较简单,就是通过复制对象去创建新的对象。

结构图如下:

                    

原文地址:https://www.cnblogs.com/JeffreySun/p/1619120.html