🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 创建型模式 * 简单工厂 * 工厂方法 * 抽象工厂 * 建造者 * 原型 * 单例 ## 简单工厂 ### 概要 * 对产品类抽象化,由具体产品类实现抽象产品类 * 工厂类负责实例化具体产品类,通过方法调用 ### 优点 将产品类的实例话与客户端剥离解藕 ### 缺点 新增产品类时需要修改工厂类,不满足开放-封闭原则的(对修改类封闭)这一条 ## 工厂方法 在简单工厂的基础上,进一步对工厂类抽象化,不同产品类由具体工厂类实例化 ### 优点 解决了简单工厂不满足封闭原则的问题 ### 缺点 增加了工作量,每新增一个产品类,需要新增对应的工厂类 ## 抽象工厂 * 存在多个抽象产品AbstractProductA,AbstractProductB,因为各自可能存在不同的实现 * 工厂类需要支持创建多种产品 ### 优点 切换Factory十分简单,只要在客户端实例化不一样的Factory类就可以 ### 缺点 * 新增Product繁琐,抽象产品类,对应工厂数量的产品类 * 修改1+N个工厂类,(1表示是工厂抽象类,N表示实现了抽象工厂的类数量)增加创建新产品类的方法 ----- 不符合开放封闭原则中的对类内部修改封闭的限制 ## 使用简单工厂优化抽象工厂 新建DataAccess类,代替 工厂抽象类&工厂类,来创建产品类。 DataAccess类新增字段属性type,表示当前的工厂类型。 创建产品类时,根据属性type 通过switch case 来创建指定的类。 ### 优点 切换工厂时,只需要修改属性type值 新增产品时,只需要新增创建新产品的方法 ### 缺点 修改的文件数从1+N减小为1,但还没有满足封闭原则。 ## 使用反射来代替switch case 通过配置的属性type 实例化指定的产品 ## 建造者 ### 描述 抽象建造者类+若干实现类。建造者类中的方法调用产品类 ### 案例 * 做鱼香肉丝 * 制作麦当劳 将对象的构建与它的表示分离。同样的构建过程可以创建不同的表示。 ### 抽象建造者 + 建造者实现类 #### 优点 建造者实现类 继承 抽象建造者,并实现抽象方法。 #### 缺点 需要在客户端调用这些建造方法 ### 引入指挥者类(Director) 实例化指挥者类的时候传入具体的建造者。 指挥者类使用建造者控制建造过程,并隔离建造者和客户端