抽象工厂和工厂方法模式

工厂方法模式

简单的来说,工厂方法模式就是将简单工厂模式解耦,将工厂类细分,使得我们添加品牌的时候不用去修改源代码,只需要自己添加一个类就可以了,简单工厂模式可以看下我的上篇博客。
同样的案例
顾客要去4s店买车,有BMW,Aodi两种选择
工厂可以有奥迪的工厂,可以有宝马的工厂,我们先画个图分析一下
抽象工厂和工厂方法模式_第1张图片
那么我们就可以先简单的写出来这三个类
抽象工厂和工厂方法模式_第2张图片
奥迪工厂负责生产奥迪的车,故返回奥迪4s店AodiCar
抽象工厂和工厂方法模式_第3张图片
宝马的工厂负责生产宝马的车,故返回BMWCar
抽象工厂和工厂方法模式_第4张图片
有奥迪的4s店,有宝马的4s店,但是他们都是卖车的,或是售后,修车,有相同的服务
抽象工厂和工厂方法模式_第5张图片
以下为服务这个接口
抽象工厂和工厂方法模式_第6张图片
奥迪4s店继承这个接口,并卖出车
抽象工厂和工厂方法模式_第7张图片
宝马4s店继承这个接口,并卖出车
抽象工厂和工厂方法模式_第8张图片
所以我们的整体结构图就很清楚了
抽象工厂和工厂方法模式_第9张图片
此工厂方法模式的优点是:
当你想增加一个品牌时,只需要自己添加一个工厂类和4s点就行了,不需要改动其他的代码,更符合开闭原则。
每个工厂类只用负责自己的产品,更符合单一职责原则,大大的降低了代码的耦合度
但是工厂方法模式有很大的缺点,就是我们每次需要新加一个品牌时都至少需要新添加一个工厂类和一个4s店类,使得java文件越来越多了,并且每个工厂只生产一种商品,造成了资源浪费

2.抽象工厂模式

	拿以上案例来说,我们可以有一个工厂接口,来负责去生产卡车还是轿车,其中有两个方法

抽象工厂和工厂方法模式_第10张图片
一个跑车接口,负责生产跑车
抽象工厂和工厂方法模式_第11张图片

													                          一个轿车接口,负责生产轿车

抽象工厂和工厂方法模式_第12张图片
宝马跑车类继承跑车接口就拥有了造跑车的能力,宝马轿车类继承轿车接口就拥有了造轿车的能力
抽象工厂和工厂方法模式_第13张图片
抽象工厂和工厂方法模式_第14张图片
同理奥迪跑车类继承跑车接口就拥有了造跑车的能力,奥迪轿车类继承轿车接口就拥有了造轿车的能力
抽象工厂和工厂方法模式_第15张图片
抽象工厂和工厂方法模式_第16张图片
奥迪工厂类继承工厂类就拥有了造跑车和轿车的能力
抽象工厂和工厂方法模式_第17张图片
同理宝马工厂类继承工厂类就拥有了造跑车和轿车的能力
抽象工厂和工厂方法模式_第18张图片
此时消费者类运行代码为
抽象工厂和工厂方法模式_第19张图片
以下附上整体代码的结构图
抽象工厂和工厂方法模式_第20张图片
抽象工厂和工厂方法模式_第21张图片

你可能感兴趣的:(设计模式)