创建型模式总结

来源:互联网 发布:专业足球数据app 编辑:程序博客网 时间:2024/05/22 05:23

到今天为止,我们已经把GOF设计模式中的创建型模式都介绍完毕呢,总结起来就是:工厂方法模式、抽象工厂模式、生成器模式、原型模式及单例模式。

流行的设计模式中,一共有这几种工厂模式:抽象工厂、工厂方法、简单工厂。所谓“工厂”这个名词在设计模式领域中表示的就是一个委托与被委托的关系,与多态无关。

简单工厂:将创建类B的职责委托给类A执行,类A就是生产类B的工厂;类B就是产品。注意,在简单工厂中只体现了职责的委托,没有父类和子类等继承关系。

工厂方法:将创建类B的职责委托给类A来执行,类B是抽象的,它有多个子类;类A也是抽象的,它也有多个子类,分别和类B的子类一一对应。注意,相比简单工厂,“工厂”这个概念在这里仍旧只体现出委托的关系,还是没有体现出“多个部件组装”的概念。不同的是,工厂方法体现了多态的概念。可以这样说,工厂方法=简单工厂 + 多态。

抽象工厂:将创建类B、C、D的职责委托给类A来执行。类B、C、D可以理解为一个产品包的多个子产品。例如一辆汽车的发动机、外壳、座椅。同时,由于产品包有多个系列,因此类B、C、D是抽象的,它们分别有各自的子类。例如经济型轿车、商务型轿车两个产品包都有各自适用的发动机、外壳和座椅子类。类似工厂方法,工厂类A也有和产品部件相对应的子类层次。和工厂方法的不同是,抽象工厂可以生产多个子产品,这些子产品组成一个整体。可以这样说,抽象工厂=可以生产多个产品系列的工厂方法。

建造模式:多个产品具有相同的创建流程或输入参数,但每个产品的内部结构和外部形态差异性较大。为所有产品的建造流程定义一个统一的向导类(Director),为所有产品内部组件的创建方法和组装方法定义一个统一接口,即抽象建造者(Abstract Builder),为每个产品实现各自的具体建造者(Concrete Builder)。向导者以具体建造者为参数,一步步的创建产品,并通过具体建造者提供的接口获取产品成品。

抽象工厂和建造模式的不同:抽象工厂侧重于创建成系列的多个产品,建造模式侧重于一步步的完成一个复杂产品的组装。

单例模式

单例模式看似简单,但从实现角度看也有其复杂的地方:

1、多线程环境下,要使用Double Check来保证实例创建时的线程安全。对于C++,要使用互斥量,对于Java,要使用synchronize关键字。

<span style="font-size:12px;">if(pSingleton == NULL){  Mutex.acquire();  if(pSingleton == NULL)  {    pSingleton = new Singleton;  }  Mutex.release();}</span>

2、需要将构造函数声明为私有,阻止非法的构造对象操作。

3、对于C++,要提供接口,在进程退出时要delete对象。

4、一般使用lazy-init,如果使用eager-int策略,对于C++,要在main函数外全局的调用getSingleton()方法。

面对上述五种创建型模式,在实际的开发过程中,我们将如何选择最适合的模式呢?当然,影响因素有很多,这需要我们学会去权衡各个创建型模式的利弊,自然在权衡之前,我们首先需要对各个创建型模式形成自己较深刻的见解,这样在面临抉择的时候才能根据实际需求作出最恰当的选择。通常来说,抽象工厂模式、生成器模式、原型模式都较工厂方法模式实现起来更加复杂一些,但是使用也更加灵活一些。但是越复杂、越灵活的东西实现起来自然也就越复杂,比如抽象工厂模式,在实现的过程中可能需要较多的工厂类来支撑,因为对于产品族中的各个具体产品都需要一个对应的工厂类来创建。通常,在软件设计之初,我们会从工厂方法模式开始设计,只有当系统中需要更大的灵活性或者说工厂方法已经不能很好地满足我们的设计理念的时候,此时,作为系统设计师的我们,便需要将设计向其他的创建型模式进行推进和演化,这当然也需要你对所有的创建型有一定的了解,这样才能在权衡各种设计模式时显得游刃有余。

至于对创建型的各个模式的详细代码演绎,在这里就不再举例列出呢。这里推荐大家去看看TerryLee对创建型模式专题总结的文章还有就是idior对创建型模式详解的文章,个人觉得讲得都比较棒,相信大家看后亦会有同感!

参考:http://www.cnblogs.com/JackyTecblog/archive/2012/09/25/2702125.html
0 0
原创粉丝点击