1. 简单工厂模式
https://my.oschina.net/leejan97/blog/311843
工厂方法模式和抽象工厂模式的区别:
-
工厂方法模式: 也就是鼠标工厂是个父类,有生产鼠标这个接口。
戴尔鼠标工厂,惠普鼠标工厂继承它,可以分别生产戴尔鼠标,惠普鼠标。
生产哪种鼠标不再由参数决定,而是创建鼠标工厂时,由戴尔鼠标工厂创建。
后续直接调用鼠标工厂.生产鼠标()即可 。 - 再举个例子:
-
布质风格
ClothCanvesView
和纸质风格PaperCanvesView
继承于父类CanvesView
; -
生产风格的任务由
CanvesViewGenerator
类完成。ClothCanvesViewGenerator
和PaperCanvesViewGenerator
继承于CanvesViewGenerator
。 -
控制器里面只会出现
CanvesView
和CanvesViewGenerator
,隐藏了具体的实现,如果后面继续添加任务的话,只需再新建新的类就行,控制器的代码无需修改。
-
抽象工厂模式: 也就是不仅生产鼠标,同时生产键盘。 也就是PC厂商是个父类,有生产鼠标、生产键盘两个接口。 戴尔工厂,惠普工厂继承它,可以分别生产戴尔鼠标+戴尔键盘,和惠普鼠标+惠普键盘。
PC厂商里有个初始化方法,根据参数不同可以生成不同的工厂,如戴尔工厂或惠普工厂。
创建工厂时,由戴尔工厂创建。 后续工厂.生产鼠标()则生产戴尔鼠标,工厂.生产键盘()则生产戴尔键盘。 - 再举个例子:
父类有个factory
的方法,子类不用重写。该方法内容如下:
+ (BrandingFactory *)factory
{
#if defined(USE_ACME)
return [[AcmeBrandingFactory alloc] init];
#else if defined(USE_SIERRA)
return [[SierraSBrandingFactory alloc] init];
#else
return nil;
}
控制器里只需初始化BrandingFactory
方法就行了。
-
类簇就是抽象工厂模式,如NSNumber。
在NSNumber中intValue和boolValue这种的方法,在具体工厂(NSCFNumber和NSCFBoolean)中重载以返回实际值(产品)。其他像numberWithBool:和numberWithInt:这样的工厂方法不是为了返回产品,而是返回能返回产品的工厂,因此它们不应该在具体工厂子类里重载。
网友评论