简单工厂/工厂方法/抽象工厂

简单工厂模式
  • 角色划分
    角色一:抽象产品
    角色二:具体产品
    角色三:具体工厂
  • 优点:
    1. 把具体产品的类型从客户端代码中解耦出来,服务器端如果修改了具体的类名,客户端不需要知道。这便符合了面向接口编程的思想。
  • 缺点:
    1. 客户端不得不死记硬背那些常量与具体产品的映射关系。比如说:1对应汉堡包,2对应米线。
    2. 如果具体产品特别多,则简单工厂就会变得十分臃肿,如果有100个产品,switch中就有100个 case。
    3. 最重要的是,变化来了后,客户端需要扩展具体的产品时,势必要修改简单工厂中的源代码,这样便违反了开闭原则。所以变化来时,扩展很不方便。这就引出了工厂方法模式。
简单工厂模式UML图
简单工厂模式UML.png
工厂方法模式(定义)

为了解决简单工厂模式中的缺点,而诞生了工厂方法模式。定义一个用于创建对象的统一的接口,然后由子类实现。

工厂方法模式->角色划分

角色一:抽象产品
角色二:具体产品
角色三:抽象工厂
角色四:具体工厂

UML图
工厂方法模式UML.png
优点:
  • 把具体产品的类型从客户端代码中解耦出来,服务端如果修改了具体的产品类名,客户端不需要知道。
  • 如果具体产品特别多时,解决简单工厂模式变得十分臃肿的问题。
  • 新增业务类时,不需要修改原有的业务类,只需要新增就行,符合开闭原则。


    工厂方法模式 新插入功能类.png
缺点:
  • 如果有多个产品等级或者有产品簇,那么工厂类的数量就会爆炸式增长。
杠点:
  • 简单工厂和工厂方法都有一个优点,服务器端的具体产品类名变化后,客户端不知道。但是工厂方法中,客户端代码依然依赖于服务端的具体工厂类名,服务端一改,客户端也要跟着修改。
解释: 
工厂的名字,是被视为接口的,服务端作者有责任和义务保证工厂名字的稳定。
虽然客户端依赖于工厂的具体类名,可是在IT业内所有工厂的名字都是趋于稳定的,
至少工厂类名的名字比具体产品类名的名字更加稳定。
  • 既然产品是客户端自己扩展出来的,为什么不直接自己实例化呢?怎么修改自己都能把控,为什么还要创建产品工厂的类呢?
因为服务端原作者开发功能时,除了开发一些抽象产品、具体产品、对应的工厂,还会配套搭建一些提前做好的框架和业务。
为了适应原有的架构,需要创建具体产品和具体工厂,而不是直接使用具体产品。
案例

工厂创建电脑->富士康工厂
华为工厂、三星工厂、苹果工厂、联想工厂…
如何知道你制造出来的产品是电脑?
因为:电脑标准规范(协议、接口)->特点
角色一:抽象产品->定义产品规范(规格)->电脑规范
角色二:具体产品->具体实现(具体制造目标)->具体电脑 具体电脑:华为电脑、三星电脑、苹果电脑…
角色三:抽象工厂->定义工厂规范和标准
角色四:具体工厂->华为工厂、三星工厂

角色一:抽象产品->ComputerProtocol
角色二:具体产品->SXComputer、HWComputer、MacComputer…
角色三:抽象工厂->ComputerFactoryProtocol
角色四:具体工厂->SXComputerFactory、HWComputerFactory…

示例程序
角色一:抽象工厂 
//电脑工厂标准
//程序中->引用关系
//判断的依据
@protocol ComputerFactoryProtocol<NSObject>

//流水线
-(id<ComputerProtocol>)getComputer;

@end
//角色三:抽象产品  电脑规范
@protocol ComputerProtocol<NSObject>

//处理器
-(void)cpu;

//显卡
-(void)displaycard;

//主板
-(void)mainborad;

@end
//角色二:  具体工厂 
@interface SXComputerFactory : NSObject<ComputerFactoryProtocol>

@end

@implementation SXComputerFactory

-(id<ComputerProtocol>)getComputer{
    return [[SXComputer alloc] init];
}

@end

@interface HWComputerFactory : NSObject<ComputerFactoryProtocol>

@end


@implementation HWComputerFactory

-(id<ComputerProtocol>)getComputer{
    return [[HWComputer alloc] init];
}

@end

//角色四: 具体产品
@interface SXComputer : NSObject<ComputerProtocol>

@end

@implementation SXComputer

//处理器
-(void)cpu{
    NSLog(@"三星处理器");
}

//显卡
-(void)displaycard{
    NSLog(@"三星显卡");
}

//主板
-(void)mainborad{
    NSLog(@"三星主板");
}

@end


@interface HWComputer : NSObject<ComputerProtocol>

@end

@implementation HWComputer

//处理器
-(void)cpu{
    NSLog(@"华为处理器");
}

//显卡
-(void)displaycard{
    NSLog(@"华为显卡");
}

//主板
-(void)mainborad{
    NSLog(@"华为主板");
}

@end
抽象工厂模式
  • 定义
    抽象工厂模式与工厂方法模式解决的问题类似。不同的是,抽象工厂模式的作用是创建一组相互关联,却又不存在共同协议或者基类的对象。
工厂方法模式->角色划分

角色一:抽象产品
角色二:具体产品
角色三:抽象工厂
角色四:具体工厂

UML图
抽象工厂模式UML.png
产品等级/产品簇
产品等级:产品簇 .png
优点
  • 依然有简单工厂和工厂方法的优点。
  • 抽象工厂把工厂方法中工厂类的数量减少了,无论多少个产品等级,无论多少个产品等级,同一类产品簇就只需要一个工厂类。
缺点

当产品等级发生变化时(增加或者删除产品等级),都要引起所有以前工厂代码的修改。这就违反了”开闭原则“。

杠点

为什么三秦工厂中,必须是米线搭配冰峰呢,为什么不能米线搭配口乐?

根据抽象工厂的定义,抽象工厂中可以生成多个产品,这多个产品之间,就必须有内在的联系。
同一个工厂中的产品都属于同一个产品簇,不能把不同产品簇中的产品混合到一个抽象工厂的实现类中。 
结论

当产品等级比较固定时,可以考虑使用抽象工厂。如果产品等级经常变化,则不建议使用抽象工厂。
如果产品等级只有一个,或者较少,那工厂方法比抽象工厂更加适用。
如果产品不需要扩充,那简单工厂最好。
如果产品经常扩展,那就使用工厂方法。
如果产品等级很多,那就使用抽象工厂。
如果产品等级经常变化,那就不适用使用工厂了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,695评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,569评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,130评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,648评论 1 297
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,655评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,268评论 1 309
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,835评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,740评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,286评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,375评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,505评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,185评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,873评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,357评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,466评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,921评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,515评论 2 359

推荐阅读更多精彩内容