设计模式--创建型模式

简单工厂模式

概念: 工厂类对你传入的参数判断(可以写在配置文件中),动态决定new 一个什么对象给你。(类似switch)。

缺点: 如果要新增一个对象,需要在工厂类里面修改(类似增加一个switch 分支)违反了开闭原则。

那么如何遵守开闭原则呢。请看工厂模式

工厂方法模式

概念: 对每一个类我都生成一个工厂类,那么新增类的时候,我只需要创建一个对应的工厂类就可以了,不需要修改原代码。(:三星工厂生产三星手机,苹果工厂生产苹果手机)

优点:符合开闭原则,同时在工厂类中也可以做方法重载。

缺点:类的膨胀,每一种类都需要定制一个工厂类

抽象工厂模式

概念:在抽象工厂中提供了不至一个类的工厂方法,而是提供了某一个产品族的工厂方法。想当于苹果工厂可以生产iphone,mac,iwatch,只需要一个工厂类就可以了。

优点:
1.新增产品族很容易:比如我现在需要小米的全家桶,那好办,我只需要增加一个小米工厂,里面有生产各个小米产品的方法。

  1. 当一个产品族的对象被设计成一起工作时,能保证客户端使用的是同一个产品族。比如:你喜欢绿色的手机主题,那么该工厂生产的按钮,背景,锁屏都是和绿色相关的,而不会出现其他颜色。再比如,你想开个苹果专卖店,那么该工厂给你生产的都是苹果的产品。

缺点:
1.新增产品线难,比如苹果的产品里现在多了一个苹果汽车,那你就需要修改苹果工厂了,需要为其增加一个生产汽车的方法。不符合开闭原则。

建造者模式

类的种类:
  1. director (负责指挥产品的构建顺序)
  2. builder (抽象建造者)
  3. buliderImpl (具体建造者)
  4. product (产品类)
适用场景:
  1. 产品类的构建场景比较繁琐(多个成员变量赋值)
  2. 一个产品类可以分为多个种类

比如说,电脑(产品类)包括cpu,内存,磁盘,显示器等,不同品牌的电脑配置都不一样,都是基本属性都是这些。那么对不同的电脑的建造可以生成多个建造器(由于建造属性一样,所以继承抽象建造者)。

苹果电脑建造器:

  1. 建造屏幕:给你弄个retina视网膜显示器
  2. 建造磁盘:给你个256g 的固体硬盘(太贵了。。)
    。。。

联想电脑建造器:

  1. 建造屏幕:给你弄个垃圾点的屏幕
  2. 建造磁盘:给你个弄个1T的磁盘
    。。。

说白了。建造器的指责就是为产品赋值,可能复杂点的情况需要考虑顺序。

director的职责

建造器只是声明了产品的每个组件怎么造,具体开工还需要director指挥,比如先造那个。其实director的职责完全可以放在建造器中。

优点:

1.客户端不用关系产品的复杂创建过程

  1. 新增产品的种类时也符合开闭原则
缺点
  1. 适用于同一个产品的不同类别,如果产品的组成成分不相同就不适用了。
  2. 如果该产品的种类很多,那么每个种类都需要一个建造器,导致类的膨胀。

你可能感兴趣的:(设计模式--创建型模式)