定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。
<AbstractProductA> <AbstractProductB>
<AbstractFactory> createProuductA createProductB
<ConcreteFactory1> createProductA->productA1 createProductB->productB1
<ConcreteFactory2> createProductA->productA2 createProuuctB->productB2
抽象工厂与工厂方法:创建对象而不让客户端知晓返回了什么确切的具体对象
抽象工厂 工厂方法
通过对象组合创建抽象产品 通过类继承创建抽象产品
创建多系列产品 创建一种产品
必须修改父类的接口才能支持新产品 子类化创建者并重载工厂方法以创建新产品
应用: 在touchPainter中为两个公司贴牌 Sierra Corporation和acme Corporation贴Sierra和Acme
tips:软件设计的黄金法则:变动需要抽象
UIView UIButton UIToolBar
brandingFactory brandedView brandedMainButton brandedToolBar
SierraBrandingFactory sierraView sierraMainButton sierraToolBar
AcmeBrandingFactory acmeView acmeButton acmeToolBar
在这种方案下,客户端只需要知道4个实体:brandingFactory、UIView、UIButton、UIToolBar,这样,将来如果需要在需要在其他领域扩展应用程序的品牌活动、可以通过添加新的产品和品牌工厂得以实现,而不影响客户端代码。
实现:
BrandingFactory:NSObject
方法:
+ (BrandingFactory *)factory;//将会返回实际的产品
- (UIView *)brandedView;// return nil;
- (UIButton *)brandedMainButton;// return nil;
- (UIToolBar *)brandedToolBar;//return nil;
+ (BrandingFactory *)factory
{
#if defined (USER_ACME)
return [[[AcmeBrandingFactory alloc]init]autorelease];
#elif defined (USER_SIERRA)
return [[SierraBrandingFactory alloc]init]autorelease];
#else
return nil;
#endif
}
AcmeBrandingFactory:BrandingFactory
并不重载 factory方法,因为他原本用于父类创建具体brandingFactory实例,但是我们无法防止类方法被子类重载。
BrandingFactory以类簇的形式实现,其中一组相关的子类组合在一起,由其超类创建。这种工厂构建过程常见于Cocoa Touch框架的基础类库。
譬如:NSNumber 有一系列共有API,定义了各种类型的数所共有的行为。客户端在使用时无需知道NSNumber实例的具体类型。
类簇是抽象工厂的一种模式,基于抽象工厂模式的思想。它将若干相关的私有具体工厂子类集合到一个公有的抽象超类之下。比如NSNumber本身是一个高度抽象的工厂,而NSCFBoolean和NSCFNumber是具体工厂子类。子类是具体工厂。
创建抽象产品的工厂方法与创建抽象工厂的工厂方法有个不同点:
显然,intValue和boolValue这样的工厂方法,应在具体工厂NSCFNumber与NSCFBoolean中重载以返回实际产品。
其他像numberWithBool:和numberWithInt,这样的工厂方法并不是为了返回产品,而是为了返回产品的工厂,因此他们不应在具体工厂子类中重载。
总结:抽象工厂模式是一种极为常见的设计模式,他是最基本的,因为他可以设计许多类型的对象创建。一系列相关类的好的模式,应该作为一种抽象,不为客户端所见。抽象工厂可以顺畅滴提供这种抽象,而不暴露创建过程中任何不必要的细节或所创建对象的确切类型。
简单工厂,工厂方法,抽象工厂之间的异同
简单工厂
简单工厂模式的工厂类一般是使用静态方法,通过接收的参数的不同来返回不同的对象实例。
不修改代码的话,是无法扩展的。
工厂方法
工厂方法是针对每一种产品提供一个工厂类。通过不同的工厂实例来创建不同的产品实例。
在同一等级结构中,支持增加任意产品。
抽象工厂
抽象工厂是应对产品族概念的。比如说,每个汽车公司可能要同时生产轿车,货车,客车,那么每一个工厂都要有创建轿车,货车和客车的方法。
应对产品族概念而生,增加新的产品线很容易,但是无法增加新的产品。
小结
★工厂模式中,重要的是工厂类,而不是产品类。产品类可以是多种形式,多层继承或者是单个类都是可以的。但要明确的,工厂模式的接口只会返回一种类型的实例,这是在设计产品类的时候需要注意的,最好是有父类或者共同实现的接口。
★使用工厂模式,返回的实例一定是工厂创建的,而不是从其他对象中获取的。
★工厂模式返回的实例可以不是新创建的,返回由工厂创建好的实例也是可以的。
区别
简单工厂 : 用来生产同一等级结构中的任意产品。(对于增加新的产品,无能为力)
工厂方法 :用来生产同一等级结构中的固定产品。(支持增加任意产品)
抽象工厂 :用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)
以上三种工厂 方法在等级结构和产品族这两个方向上的支持程度不同。所以要根据情况考虑应该使用哪种方法。
原文链接:http://blog.csdn.net/superbeck/article/details/4446177