(1)     Simple Factory Pattern

定义:专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类,它又称为Static Factory Method模式,通常它根据自变量的不同返回不同类的实例。

说明:它实质上是由一个工厂类根据传入的参数,动态决定应该创建出哪一个产品类的实例。

优势:通过使用工厂类,外界可以从直接创建产品对象的尴尬局面中摆脱出来,仅仅需要负责“消费”对象就可以了,不必管这些对象是如何创建和组织的。(区分了各自的职责和权力,有利于软件体系结构的优化)

劣势:由于工程类集中了所有实例的创建逻辑,很容易违反GRASPR的高内聚的责任分配原则;同时,随着系统中产品种类的不断增多,可能会出现要求工程类根据不同的条件创建不同的产品实例,这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的扩展和维护也非常不利。

应用场景:

1.   工厂类负责创建的对象比较少。

2.   客户只知道传入工程类的参数,对于如何创建对象不关心。

2Factory Method Pattern

定义:又称Factory PatternVirtual Constructor PatternPolymorphic Factory Pattern。在该模式中,父类负责定义创建对象的公共接口,而子类负责生产具体的对象,这样做的目的是将类的实例化操作延迟到子类来完成,即由子类来决定究竟应该实例化(创建)那个类。


说明:它克服了
Simple Factory Pattern的缺点(新的产品加入系统需要修改工厂类)

优势:由工厂方法创建客户所需要的产品,同时向用户隐藏了哪种具体产品类将被实例化这一细节(客户只需关心抽象产品和抽象工厂);加入新产品时,无需修改抽象工厂和抽象产品的接口,无需修改客户端,无需修改其他具体产品或具体工厂,只需添加一个具体产品或具体工厂即可。

劣势:新产品所需的具体产品或具体工厂的编写需要相对额外的开销

应用场景:

1.   类不知道自己要创建那个对象

2.   类用它的子类来指定创建那个对象

3.   客户需要清楚创建了哪个对象

3Abstract Factory Pattern

定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。又称Kit Pattern


说明:它与
Factory Method Pattern的主要区别是,Factory Method针对的是一个产品等级,而Abstract Factory针对的是多个产品等级。

优势:

隔离了具体类的生成,使客户不需要知道什么被创建了(更换具体工厂变得相对容易);

当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象,这对于一些需要根据当前环境来决定其行为的软件系统来说,非常实用。

劣势:添加新的产品对象时,难以扩展抽象工厂以便生产新种类的产品。(因为Abstract Factory接口规定了所有可能被创建的产品集合,要支持新种类的产品就意味着要对该接口进行扩展,这涉及到Abstract Factory及其所有子类的修改)

应用场景:

1.   系统需要屏蔽有关对象如何创建、组织和表示。

2.   系统由关联的多个对象来构成

3.   有关联的多个对象需要一起应用并且它们的约束是强迫的(不可分离)

4.   想提供一组对象而不显示它们的实现过程,只显示它们的接口

4Builder Pattern

定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。它是一步一步地创建一个复杂的对象,它允许用户只通过指定负责对象的类型和内容就可以创建它们,用户不知道内部的具体构建细节。


说明:
Director的作用:隔离了客户的生产过程;负责控制产品的生产过程。与Abstract Factory的区别:Builder返回完整的一个产品,而Abstract Factory返回一系列有关系的产品。

优势:它将一个复杂对象的生成责任作了很好的分配。(把构造过程放到指挥者的方法中,把装配过程放到具体的构造者中)。

劣势:如果产品的内部变化复杂,需要定义多个具体的构造类来实现这种变化。

适用场景:

1.   创建负责对象的算法是独立于它的组成部件及装配过程。

2.   构造的过程运行构造对象有不同的表现。

5Prototype Pattern

定义:指定创建对象的种类,并且通过拷贝这些原型创建新的对象,根本不需要知道任何创建的细节。


说明:工作原理:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝原型自己来实施创建过程。

优势:在创建对象成本较大的情况下(初始化需要的时间长,占用较多CPU或网络资源),新对象可以通过原型模式对已有对象的属性进行复制并稍作修改来取得;如果要保存对象的状态,而状态变化很小,或者对象本身占内存不大的时候,也可以使用原型模式结合备忘录模式来应用。相反,如果对象的状态变化很大,或对象占有的内存很大,则采用状态模式更好。

劣势:实现深层复制需要复杂的代码

应用场景:

1.   类的实例化是动态的。

2.   需要避免使用分层次的工厂类来创建分层次的对象。

3.   类的实例对象只有一个或很少的几个组合。

6Singleton Pattern

定义:确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类成为单例类,它提供全局访问的方法。


说明:要点:类只能有一个实例;它必须自行创建这个实例;它必须向整个系统提供这个实例。

优势:为一个面向对象的应用程序提供了对象唯一的访问点,这为设计及开发团队提供了共享的概念。

劣势:无法派生子类。

应用场景:

1.   系统只需要一个实例对象

2.   客户调用的单个实例只允许使用一个公共访问点。

 

 

 

posted on 2008-05-14 19:34  wxf0701  阅读(252)  评论(0编辑  收藏  举报