总结
简言之,客户需要产品时找工厂要,而不是客户自己要产品。前者客户只需要 "向工厂申请产品"的接口,后者客户需要"申请产品1", "申请产品2"等多个接口。
工厂模式体现了程序设计中的:
- 依赖倒转原则 (抽象依赖抽象,在抽象工厂模式中有体现)
- 最小知识原则? (客户只和工厂打交道)
不知名原则:
- 以代码量换取扩展性 (俺自己起的不行嘛.....)
思考
- 工厂模式想解决的问题:有较多产品时,与其让客户接触杂乱的产品接口,不如接触一个工厂接口,通过工厂访问产品。
- 工厂模式面对的问题:随着产品的增加,工厂的负担加重。如果工厂过于"全能",其生产产品的方法会冗长;如果工厂过于"术业有专攻",工厂的数量将接近于产品的数量,代码二倍增长。
- 站在客户的角度,工厂模式是简约的;站在开发者的角度,工厂模式是繁琐的。相比于简单工厂模式,工厂方法模式扩展性更强,是以代码量换取扩展性。
- 感觉这是面向过程思考出的结果,如果只是面向对象,很难将对象抽象出工厂模式。
简单工厂模式
要素:具体工厂类,抽象产品类,具体产品1类,具体产品2类。
- 具体产品1类:比如 福田车;
- 具体产品2类:比如 广汽车;
- 抽象产品类:比如 车,是上两个的父类。提供
刹车
等虚函数; - 抽象工厂类:比如 汽车工厂,提供
生产车辆
的方法,根据传入参数,决定生产的产品类型。
客户使用时需要:
- 创建
汽车工厂对象
; 汽车工厂对象
调用生产车辆
的方法 (传入参数为福田
时,汽车工厂.生产车辆("福田")
);- 得到
福田车对象
;
工厂方法模式
在"简单工厂模式"中,汽车工厂类
过于抽象,随着产品种类的增加,汽车工厂类
中的生产车辆
方法将变得十分臃肿。如果有 福田车工厂类
,广汽车工厂类
更好,这样一个工厂生产一种汽车,增加一种汽车就增加对应工厂生产它。于是改进为:
- (具体产品类) 福田车类;
- (具体产品类) 广汽车类;
- (抽象产品类) 车类;
- (抽象工厂类) 汽车工厂类;
- (具体工厂类) 福田车工厂类;
- (具体工厂类) 广汽车工厂类;
客户使用时需要:
- 根据传入参数决定将
汽车工厂类对象
初始化为福田车工厂
还是广汽车工厂
; 福田车工厂对象
调用生产车辆方法
;- 得到
福田车对象
;
抽象工厂模式
在"工厂方法模式"中,每增加一种具体产品,就增加一种具体工厂,开发成本大。但是抽象工厂模式不是为了解决这个问题滴(我是这么理解的,欢迎纠错)。比如 我想买 巧克力饼干
,希望有一个巧克力饼干工厂
,这个工厂同时依赖巧克力类
,饼干类
(前两种模式中工厂只依赖一种产品类,此处依赖多种产品类),提供生产巧克力
和生产饼干
的接口。
客户使用时需要:
- 初始化
巧克力饼干工厂对象
; - 该对象调用
生产巧克力
和生产饼干
的接口; - 得到
巧克力对象
和饼干对象
; - (同时吃巧克力和饼干得到巧克力饼干);