1. 主要区别
抽象工厂 | 工厂方法 |
通过对像组合创建产品 | 通过类继承来创建产品 |
生成一系列产品(eg:生成某类view,button,或者其他) | 生成某一种产品(eg:生成某类view) |
必须修改父类接口,才能生成新的产品 | 子类化创建者并重载工厂方法 以创建新产品 |
2.1 工厂方法
显然,下面的例子中PaperCanvasView和ClothCanvasView继承自CanvasView,通过重载CanvasView的工厂方法而生成了新的一种产品。
@interface CanvasViewGenerator : NSObject - (CanvasView *) canvasViewWithFrame:(CGRect) aFrame;
@implementation PaperCanvasViewGenerator- (CanvasView *) canvasViewWithFrame:(CGRect) aFrame { return [[[PaperCanvasView alloc] initWithFrame:aFrame] autorelease];}
@implementation ClothCanvasViewGenerator- (CanvasView *) canvasViewWithFrame:(CGRect) aFrame { return [[[ClothCanvasView alloc] initWithFrame:aFrame] autorelease];}
工厂方法的应用场景:
2.1.1. 编译时无法准备预期要生成的创建的对象的类
2.1.2. 类需要由子类决定运行时生成什么。
2.2 抽象工厂
一样的先上代码:
@interface BrandingFactory : NSObject + (BrandingFactory *) factory;- (UIView *) brandedView;- (UIButton *) brandedMainButton;- (UIToolbar *) brandedToolbar;
@implementation BrandingFactory+ (BrandingFactory *) factory { #if defined (USE_ACME) return [[[AcmeBrandingFactory alloc] init] autorelease]; #elif defined (USE_SIERRA) return [[[SierraBrandingFactory alloc] init] autorelease]; #else return nil; #endif}- (UIView *) brandedView {return nil;}- (UIButton *) brandedMainButton {return nil;}- (UIToolbar *) brandedToolbar{return nil;}显然这里有两个工厂,生成了一系列的产品如 UIView, UIButton, UIToolbar。而这两个工厂又是由 BrandingFactory产生的。子类需要重写这三个方法才能生成新的产品。
抽象工厂的应用场景:
抽象工厂提供一个固定的接口,用于创建一系列由关联或者相依存的对象,而不必指定其具体类或其创建细节。
(引用书中的例子:虽然每家店的比萨饼不一样,同一家比萨饼也有多种口味,但是制作的基本步骤确实一样的。对于我们,将比萨饼看成一种食物,厨师就像是生成比萨饼的工厂。但实际的产品的细节会有所不同。所以,厨师们都知道制作比萨饼的“通用的”或“抽象”的基本知识,但他们有自己的“实现”或“具体”,因此产生的比萨饼不一样)