简单工厂模式
概念: 工厂类对你传入的参数判断(可以写在配置文件中),动态决定new 一个什么对象给你。(类似switch)。
缺点: 如果要新增一个对象,需要在工厂类里面修改(类似增加一个switch 分支)违反了开闭原则。
那么如何遵守开闭原则呢。请看工厂模式
工厂方法模式
概念: 对每一个类我都生成一个工厂类,那么新增类的时候,我只需要创建一个对应的工厂类就可以了,不需要修改原代码。(:三星工厂生产三星手机,苹果工厂生产苹果手机)
优点:符合开闭原则,同时在工厂类中也可以做方法重载。
缺点:类的膨胀,每一种类都需要定制一个工厂类
抽象工厂模式
概念:在抽象工厂中提供了不至一个类的工厂方法,而是提供了某一个产品族的工厂方法。想当于苹果工厂可以生产iphone,mac,iwatch,只需要一个工厂类就可以了。
优点:
1.新增产品族很容易:比如我现在需要小米的全家桶,那好办,我只需要增加一个小米工厂,里面有生产各个小米产品的方法。
- 当一个产品族的对象被设计成一起工作时,能保证客户端使用的是同一个产品族。比如:你喜欢绿色的手机主题,那么该工厂生产的按钮,背景,锁屏都是和绿色相关的,而不会出现其他颜色。再比如,你想开个苹果专卖店,那么该工厂给你生产的都是苹果的产品。
缺点:
1.新增产品线难,比如苹果的产品里现在多了一个苹果汽车,那你就需要修改苹果工厂了,需要为其增加一个生产汽车的方法。不符合开闭原则。
建造者模式
类的种类:
- director (负责指挥产品的构建顺序)
- builder (抽象建造者)
- buliderImpl (具体建造者)
- product (产品类)
适用场景:
- 产品类的构建场景比较繁琐(多个成员变量赋值)
- 一个产品类可以分为多个种类
比如说,电脑(产品类)包括cpu,内存,磁盘,显示器等,不同品牌的电脑配置都不一样,都是基本属性都是这些。那么对不同的电脑的建造可以生成多个建造器(由于建造属性一样,所以继承抽象建造者)。
苹果电脑建造器:
- 建造屏幕:给你弄个retina视网膜显示器
- 建造磁盘:给你个256g 的固体硬盘(太贵了。。)
。。。
联想电脑建造器:
- 建造屏幕:给你弄个垃圾点的屏幕
- 建造磁盘:给你个弄个1T的磁盘
。。。
说白了。建造器的指责就是为产品赋值,可能复杂点的情况需要考虑顺序。
director的职责
建造器只是声明了产品的每个组件怎么造,具体开工还需要director指挥,比如先造那个。其实director的职责完全可以放在建造器中。
优点:
1.客户端不用关系产品的复杂创建过程
- 新增产品的种类时也符合开闭原则
缺点
- 适用于同一个产品的不同类别,如果产品的组成成分不相同就不适用了。
- 如果该产品的种类很多,那么每个种类都需要一个建造器,导致类的膨胀。
网友评论