前言
本文是对《Adroid 源码设计模式解析与实战》 何红辉、关爱民 著 人民邮电出版社所做的读书笔记。文章是对本书的一些列学习笔记,如若有侵犯到作者权益,还望作者能联系我,我会及时下架。
这本书不错,有兴趣的同学可以买原书看看。
感兴趣的朋友欢迎加入学习小组QQ群: 193765960。
版权归作者所有,如有转发,请注明文章出处:https://xiaodanchen.github.io/archives/
1. 抽象工厂模式的定义
为创建一组相关或者相互依赖的对象提供一个接口。(生产某款产品的零部件)
2. 抽象工厂模式的实现
上一篇讲到,小明开了个Audi车组装工厂。随着小明生意越做越大,安奈不住骚动的心的小明,开始向产品上游伸手,丫的要自己生产汽车零配件!
但是谈何容易, Audi的Q3,Q5,Q7使用的零件各不相同,这可愁坏了小明。没办法,只能再找找小民帮忙拿主意了。最终小民给出了终极解决方案:抽象工厂模式。
按照小民的设计,小明开办了3个零件工厂:Q3零部件工厂、Q5零部件工厂、Q7零部件工厂。
源码
假设小明的零件工厂要生产三类产品:轮胎、发动机、制动系统。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| * 抽象零件:轮胎 */ public interface ITire{ public void tire(); } * 抽象零件:发动机 */ public interface IEngine{ public void engine(); } * 抽象零件:刹车系统 */ public interface IBrake{ public void brake(); } * 抽象零件工厂 */ public abstract class AbstractFactory{ public abstract ITire createTire(); public abstract IEngine createEngine(); public abstract IBrake createBrake(); }
|
以Q3汽车零件生产厂为例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| public class Q3Tire implements ITire{ public void tire(){...}; } public class Q3Engine implements IEngine{ public void engine(){...}; } public class Q3Brake implements IBrake{ public void brake(){...}; } * Q3零件工厂 */ public class Q3Factory extends AbstractFactory{ public ITire createTire(){ return new Q3Tire(); }; public IEngine createEngine(){ return new Q3Engine(); }; public IBrake createBrake(){ return new Q3Brake(); }; }
|
零件工厂建好了,开足马力投产吧
1 2 3 4 5 6 7 8 9 10
| public class Client{ public static void main(String[] args){ AbstractFactory factory = new Q3Factory(); factory.createTire().tire(); factory.createEngine().engine(); factory.createBrake().brake(); } }
|
解析
每增加一个产品工厂,就要创建一堆的产品零件类,如果工厂类过多,那么就会导致类文件非常多。所以在实际开发中,抽象工厂模式的运用要权衡
3. 总结
优点:
接口与实现分离,客户端使用抽象工厂来生产产品,生产过程完全面向接口,不需要知道具体实现。
缺点:
工厂类增加很多,类文件会增加很多。不太容易扩展新的产品类。