工厂设计模式

基于不同的情况创建不同的对象,这个过程就不easy了,创建型设计模式(Creational Pattern)对类的实例化过程进行的抽象。

1.简单工厂模式(simple factory pattern)

静态方法工厂模式(static Faictory Pattern)

工厂角色:负责实现创建全部实例的内部逻辑,工厂类能够被外界直接调用,创建所需的产品。

抽象产品角色:简单工厂模式所创建的全部对象的父类。它负责描写叙述全部实例全部共同拥有的公共接口。

详细产品角色:全部创建的对象都是充当这个角色的某个详细类的实例。

 

优势和缺陷

在简单工厂模式中,工厂类是整个模式的关键所在。它包括必要的推断逻辑,能够依据外界的信息,决定到底应该创建那个详细类的对象。通过使用工厂类,外界能够从直接创建详细产品对象的尴尬局面中摆脱出来,只须要负责“消费”对象就能够了,而不必管这些对象到底是怎样创建以及怎样组织的。这样就明白区分了各自的职责和权力,有利于整个软件体系结构的优化。

 

应用情景

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

2.       客户仅仅知道传入工厂类的參数,对于怎样创建对象逻辑不关心。

 

 

2.工厂方法模式(Factory Method Pattern):

在简单工厂模式中,一个工厂类处于对产品类进行实例化的中心位置。它知道每个产品的细节,并决定何时是哪一个产品类的实例化,。简单工厂模式的长处是可以使client独立于产品的创建过程,而且在系统中引入新产品时无需对client进行改动,缺点是当一个新产品要增加到系统中的时候,必须改动工厂类,以增加必要的处理逻辑。简单工厂模式的致命弱点就是出于核心地位的工厂类,由于一旦它无法确定要对那个类进行实例化,就无法使用该模式。而工厂方法模式则可以非常好的解决这一个问题。

 

产品角色(Product):定义产品接口

真实产品(ConcreteProduct):实现接口Product的类

工厂角色(Creator):声明工厂方法,返回一个产品

真实的工厂(ConcreteCreator):实现工厂方法,有客户调用,放回一个产品的实例

 

基于工厂角色和产品角色的多态性设计是工厂方法模式的关键。她能够是工厂能够自主确定创建何种产品对象,二怎样创建这个对象的细节则全然封装在详细工厂内部。使用工厂方法模式的还有一个长处在于系统在加入新产品的时候无需改动抽象工厂类和抽象产品提供的接口,无需改动client,也无需改动其它的详细工厂和详细产品,而是仅仅要加入一个详细工厂和详细产品就能够了,这样,系统的可扩展性很好。

 

应用情景:

1.       类不知道自己要创建哪一个对象。

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

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

 

 

 

抽象工厂模式(Abstract Factory Pattern):

抽象工厂模式与工厂方法模式的最大差别在于:工厂方法模式针对的是一个产品等级结构,而抽象工厂模式则针对的是多个产品等级结构。正应为如此,抽象工厂模式中常常会用到产品族的概念(Product Family)这一概念,它是指位于不同的产品等级结构中,而且功能相互关联的产品系列。

 

抽象工厂(AbstractFactory):声明生成抽象产品的方法

详细工厂(ConcreteFactory):运行生成抽象产品的方法,生成一个详细的产品

抽象产品(AbstractProduct):为一种产品声明接口

详细产品(ConcretePorduct):定义一个详细工厂生成的详细抽象的对象,实现产品接口

 

抽象工厂负责创建不同的有联系的多个产品,不同的抽象工厂创建的产品不同,但产品之间的关系同样。

 

优势和缺陷:

抽象工厂的模式主要优点是隔离了详细类的生成,使得客户部须要知道什么被创建了,因为这样的隔离,更换一个详细工厂就变得相对easy。全部的详细工厂都实现了抽象工厂中定义的那些公共接口,因此朱旭改变详细工厂的实例,就能够再某种程度上改变整个软件系统的行为。使用抽象工厂模式的最大优点是,当一个产品族中的多个对象被设计成一起工作时,她能保证client仅仅是使用同一个产品族中的对象。

抽象工厂模式的缺点是,在加入心的产品对象是,难以扩展抽象工厂一边生产心种类的产品。这是由于AbstractFactory接口中贵的那个了全部 可能被创建的产品集合,要支持新种类的产品就意味着要对该接口进行扩展,二者将涉及到AbstractFactory几去全部子类的改动,显然是有小小的不便,但不重要。

 

应用情景:

1.       系统须要屏蔽有关对象怎样创建、怎样主旨和怎样表示。

2.       系统须要有关联的多个对象来构成。

3.       有关的多个对象须要一起应用而且他们的约束是强迫的(不可分离的)

4.       你想提供一组对象儿不显示他们的实现过程,仅仅是显示他们的接口。

你可能感兴趣的:(设计模式)