Jerry Lee

stay hungry,stay young.

Welcome to my world.


设计模式 抽象工厂模式



抽象工厂.png-4.5kB

定义

提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类,抽象工厂和工厂方法不同的地方在于,生产产品的工厂是抽象的。

抽象工厂模式和工厂方法模式很相似,但是抽象工厂模式将抽象发挥的更加极致,是三种工厂模式中最抽象的一种设计模式。抽象工厂模式,也叫做Kit模式,提供了创建一系列相关抽象子类的接口,而无需指定它们具体的类型。

抽象工厂模式中定义了抽象工厂类,抽象工厂类中定义了每个系列的抽象子类创建所需的方法,这些方法对应着不同类型的抽象子类实例化过程。每个工厂子类都对应着一个系列,工厂子类通过重写这些方法来实例化当前系列的抽象子类。

抽象工厂模式包含四部分:

抽象工厂类:定义创建抽象子类的具体行为,根据系列中不同类型的抽象子类可能会有多种行为。

工厂子类:继承自抽象工厂类,根据当前抽象子类对应的系列,重写父类定义的对应行为。对应的抽象子类系列不同,行为的实现方式也不同。

抽象类:定义当前类型抽象子类的操作,子类继承父类完成具体的操作。在抽象工厂模式中,可能会有多种抽象类的定义。

抽象子类:根据当前类型继承自对应的抽象类,并根据系列的不同重写抽象类定义的实现。

和工厂方法模式有什么不同

在工厂方法模式中,工厂子类负责抽象子类的实例化,每个工厂子类对应着一个抽象子类,且具有唯一性。而在抽象工厂模式中,一个工厂子类代表一个系列,工厂子类根据当前系列对不同类型的抽象子类进行创建。工厂方法模式中工厂子类对应的是一个类型的抽象子类,抽象工厂模式对应的是一个系列的抽象子类。 工厂方法模式一个工厂子类对应一个抽象子类的设计,会有很大的浪费,产生了过多的类。而抽象工厂模式更好的利用了工厂子类,使每个工厂子类对应着一个系列的抽象子类,这种设计非常适用于两个具有相同结构关系,但是分属于不同系列的系列之间的切换。 总之就是,工厂方法模式是针对单个类型的抽象类,而抽象工厂模式是针对具有相同结构的一系列类型的抽象类。

举例

可口可乐公司生产可乐的同时,也需要生产装可乐的瓶子和箱子,瓶子和箱子也是可口可乐专属定制的,同样百事可乐公司也会有这个需求。这个时候我们的工厂不仅仅生产可乐饮料的工厂,还必须同时生产同一主题的瓶子和箱子,所以它是一个抽象的主题工厂,专门生产同一主题的不同商品。

优点

1.具体产品在应用层代码隔离,不需要关心产品细节。只需要知道自己需要的产品是属于哪个工厂的即可;

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

缺点

规定了所有可能被创建的产品集合,产品族中扩展新的产品困难,需要修改抽象工厂的接口;

##代码举例##

@implementation CocaColaFactory
+(Cola *)createCola{
return [CocaCola new];
}

+(CocaColaBottle*)createBottle{
return [CocaColaBottle new];
}

+(CocaColaBox*)createBox{
return [CocaColaBox new];
}

@implementation PesiColaFactory
+(Cola *)createCola{
return [PesiCola new];
}

+(PesiColaBottle*)createBottle{
return [PesiColaBottle new];
}

+(PesiColaBox*)createBox{
return [PesiColaBox new];
}
最近的文章

设计模式 单例模式

定义单例模式确保某一个类只有一个实例,并提供一个访问它的全局访问点。举例单例模式下,对应类只能生成一个实例。就像一个王国只能有一个国王,一旦王国里的事物多起来,这唯一的国王也容易职责过重。优点1、提供了对唯一实例的受控访问。因为单例类封装了它的唯一实例,所以它可以严格控制客户怎样以及何时访问它;2、因为该类在系统内存中只存在一个对象,所以可以节约系统资源。缺点1、由于单例模式中没有抽象层,因此单例类很难进行扩展;2、对于有垃圾回收系统的语言Java,C#来说,如果对象长时间不被利用,则可能...…

继续阅读
更早的文章

设计模式 工厂方法模式

定义又称为工厂模式,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,即通过不同的工厂子类来创建不同的产品对象;工厂方法模式和简单工厂模式十分类似,大致结构是基本类似的。不同在于工厂方法模式对工厂类进行了进一步的抽象,将之前的一个工厂类抽象成了抽象工厂和工厂子类,抽象工厂定义一个创建抽象子类的接口,抽象工厂的子类实现这些接口并决定实例化哪个抽象子类。工厂子类决定着创建哪个抽象子类,外界决定着创建哪种工厂子类,抽象子类和工厂子类是一一对应的。在工厂方法模式中,和简单...…

继续阅读