创建型设计模式

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

创建型模式要解决的主要问题就是类的使用者和类实例的创建(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/archive/2009/12/11/1619120.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值