文章目录

  • 思考生成者模式
    • 1.生成器模式的本质
    • 2.何时选用生成器模式
    • 3.优缺点
    • 4.生成器模式的结构
    • 5.实现
      • 生成器模式构建对象的多种表示形式
      • 生成器模式链式构建对象

思考生成者模式

生成器模式就是将对象构建和对象内部构建分离,将一个复杂对象的构建(外壳) 与 它的表示(内部实现)分离,使得同样的构建过程可以创建不同的表示
对象构建:手机的构建
对象内部构建:手机中屏幕、电池和芯片的构建

1.生成器模式的本质

生成器模式的本质:分离整体对象构建算法和对象的部件构造。

构建一个复杂的对象,本来就有构建的过程,以及构建过程中具体的实现(表示形式)。生成器模式就是用来分离这两个部分,从而使得程序结构更松散、扩展更容易、复用性更好,同时也会使得代码更清晰,意图更明确。

对象的构建过程和表示形式指的是什么?

对象的构建过程指的是将一个复杂对象逐步构建的过程,这个过程通常需要按照一定的顺序完成多个步骤,每个步骤可能包括创建对象的某些部分、初始化对象的状态等。例如,在汽车生成器模式中,对象的构建过程包括构建车身、构建发动机和构建轮胎等多个步骤。

表示形式指的是复杂对象的最终表现形式,也就是我们最终要创建的对象的形态和特征。例如,在汽车生成器模式中,表示形式指的是车辆的各个部分的组合方式和特定的配置。不同的表示形式可能需要使用不同的生成器来创建,但是它们的构建过程可能是相同的。

在生成器模式中,将对象的构建过程和表示形式分离开来,可以使得我们能够更加灵活地创建对象,并且能够重用构建过程的代码,减少重复工作。

2.何时选用生成器模式

建议在以下情况中选用生成器模式。

  • 对象构建的属性不会变,而其组合经常变化的时候 ,就可以选择这样的设计模式来构建代码
  • 如果同一个构建过程有着不同的表示时。
    • 在软件开发中,有些复杂对象的构建过程可能是相同的,但是最终的表示形式却可能存在差异。这时候,如果我们采用传统的工厂模式或者抽象工厂模式来创建对象,那么就需要针对每种表示形式都编写对应的工厂方法,这样会导致代码的复杂度增加。
      相比之下,生成器模式则提供了一种更加灵活的解决方案。通过将对象的构建过程与表示分离开来,生成器模式允许我们使用相同的构建过程来创建不同的表示形式。这是因为,生成器模式将对象的构建过程抽象为一个生成器接口,并提供了不同的具体生成器实现,每个具体生成器实现都负责创建特定的表示形式。而指挥者类则负责协调不同的具体生成器,按照特定的顺序调用生成器的方法,完成表示对象的构建。
      因此,当我们需要使用同一个构建过程来创建不同的表示形式时,使用生成器模式可以帮助我们提高代码的复用性和灵活性。

3.优缺点

生成器模式有以下优点

  • 松散耦合
    生成器模式可以用同一个构建算法构建出表现上完全不同的产品,实现产品构建和产品表现上的分离。生成器模式正是把产品构建的过程独立出来,使它和具体产品的表现松散耦合,从而使得构建算法可以复用,而具体产品表现也可以灵活地、方便地扩展和切换。

  • 可以很容易地改变产品的内部表示
    在生成器模式中,由于Builder对象只是提供接口给Director使用,那么具体的部件创建和装配方式是被 Builder 接口隐藏了的,Director并不知道这些具体的实现细节。这样一来,要想改变产品的内部表示,只需要切换 Builder的具体实现即可,不用管Director,因此变得很容易。

  • 更好的复用性
    生成器模式很好地实现了构建算法和具体产品实现的分离。这样一来,使得构建产品的算法可以复用。同样的道理,具体产品的实现也可以复用,同一个产品的实现,可以配合不同的构建算法使用。

4.生成器模式的结构

  • Builder:生成器接口,定义创建一个Product对象所需的各个部件的操作。
  • ConcreteBuilder:具体的生成器实现,实现各个部件的创建,并负责组装 Product对象的各个部件,同时还提供一个让用户获取组装完成后的产品对象的方法。
  • Director:指导者,也被称为导向者,主要用来使用Builder接口,以一个统一的过程来构建所需要的 Product对象。
  • Product:产品,表示被生成器构建的复杂对象,包含多个部件。

5.实现

生成器模式构建对象的多种表示形式

/*** @description:手机构建器接口*/
public interface PhoneBuilder {/*** 构建屏幕*/void buildScreen();/*** 构建电池*/void buildBattery();/*** 构建芯片*/void buildChip();/*** 获取构造的手机对象*/Phone getPhone();
}/*** @description:苹果手机构建类*/
@Data
public class ApplePhone implements PhoneBuilder{private Phone phone;public ApplePhone(){//初始化手机对象phone=new Phone();}@Overridepublic void buildScreen() {phone.setScreenSize("16寸");}@Overridepublic void buildBattery() {phone.setBatteryCapacity(5000d);}@Overridepublic void buildChip() {phone.setChipType("苹果芯片");}@Overridepublic Phone getPhone() {return this.phone;}
}/*** @description:oppo手机构建类*/
@Data
public class OppoPhone implements PhoneBuilder{private Phone phone;public OppoPhone(){//初始化手机对象phone=new Phone();}@Overridepublic void buildScreen() {phone.setScreenSize("18寸");}@Overridepublic void buildBattery() {phone.setBatteryCapacity(6000d);}@Overridepublic void buildChip() {phone.setChipType("华为芯片");}@Overridepublic Phone getPhone() {return this.phone;}
}

指导者

/*** @description:指导者对象(指导如何构建手机)*/
@Data
public class Director {/*** 手机构建器*/private PhoneBuilder phoneBuilder;public Phone build(){//按顺序构建手机对象phoneBuilder.buildScreen();phoneBuilder.buildBattery();phoneBuilder.buildChip();return phoneBuilder.getPhone();}
}

测试

/*** @description:测试类*/
public class Client {public static void main(String[] args) {//指导者对象Director director = new Director();Phone phone;//指导苹果手机构建PhoneBuilder phoneBuilder1=new ApplePhone();director.setPhoneBuilder(phoneBuilder1);phone = director.build();System.out.println(phone);//指导oppo手机构建PhoneBuilder phoneBuilder2=new OppoPhone();director.setPhoneBuilder(phoneBuilder2);phone = director.build();System.out.println(phone);}
}

结果:

Phone(screenSize=16寸, batteryCapacity=5000.0, chipType=苹果芯片)
Phone(screenSize=18寸, batteryCapacity=6000.0, chipType=华为芯片)

生成器模式链式构建对象

构建器接口

/*** @description:手机构建器接口*/
public interface PhoneBuilder2 {/*** 构建屏幕*/PhoneBuilder2 buildScreen(String screenSize);/*** 构建电池*/PhoneBuilder2 buildBattery(Double batteryCapacity);/*** 构建芯片*/PhoneBuilder2 buildChip(String chipType);/*** 获取构造的手机对象*/String getPhone();
}/*** @description:手机构建器过程*/
@NoArgsConstructor
public class ConcreteBuilder implements PhoneBuilder2 {/*** 手机品牌*/private String phoneBrand;/*** 手机对象*/private Phone phone = new Phone();public ConcreteBuilder(String phoneBrand) {this.phoneBrand = phoneBrand;}@Overridepublic PhoneBuilder2 buildScreen(String screenSize) {this.phone.setScreenSize(screenSize);return this;}@Overridepublic PhoneBuilder2 buildBattery(Double batteryCapacity) {this.phone.setBatteryCapacity(batteryCapacity);return this;}@Overridepublic PhoneBuilder2 buildChip(String chipType) {this.phone.setChipType(chipType);return this;}@Overridepublic String getPhone() {return phoneBrand + "{" +"screenSize='" + phone.getScreenSize() + '\'' +", batteryCapacity=" + phone.getBatteryCapacity() +", chipType='" + phone.getChipType() + '\'' +'}';}
}

指导者

/*** @description:指导者对象*/
public class Director2 {/*** 指导构建苹果手机* @return*/public PhoneBuilder2 buildAppPhone() {return new ConcreteBuilder("苹果手机").buildScreen("16寸").buildBattery(5000d).buildChip("苹果芯片");}/*** 指导构建oppo手机* @return*/public PhoneBuilder2 buildOppoPhone() {return new ConcreteBuilder("Oppo手机").buildScreen("18寸").buildBattery(6000d).buildChip("华为芯片");}
}

测试类

public class Client {public static void main(String[] args) {Director2 director=new Director2();System.out.println(director.buildAppPhone().getPhone());System.out.println(director.buildOppoPhone().getPhone());}
}

结果

苹果手机{screenSize='16寸', batteryCapacity=5000.0, chipType='苹果芯片'}
Oppo手机{screenSize='18寸', batteryCapacity=6000.0, chipType='华为芯片'}

生成器(建造者)模式相关推荐

  1. 我的设计模式之旅(4)——生成器(建造者)模式Builder

    Builder模式也是创建型模式中的一种.主要用来应对构成复杂但构成结构和顺序相对稳定的对象的创建工作.目的是省去在对象发生变化时,需要修改代码中每一处对象创建的地方,应用这种模式,可以在一个复杂对象 ...

  2. 设计模式之建造者模式(生成器模式、Builder)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式包括:1.FactoryMethod(工厂方法模式):2.Abstract Factory(抽象工厂模式):3.Sin ...

  3. 设计模式(4)建造者模式/生成器模式(Builder)

    设计模式(0)简单工厂模式 设计模式(1)单例模式(Singleton) 设计模式(2)工厂方法模式(Factory Method) 设计模式(3)抽象工厂模式(Abstract Factory) 源 ...

  4. 建造者模式 生成器模式 创建型 设计模式(五)

    建造者模式 Builder 也叫做生成器模式 在正式开始建造者模式之前,先回顾下抽象工厂模式 本人的所有系列文章都是自己学习的记录过程,均有比较严格的先后顺序,如果不清楚抽象工厂模式可以先往前翻翻 从 ...

  5. 设计模式-------建造者模式(生成器模式)

    建造者模式(生成器模式)定义:将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 建造者模式中的4个角色: Product产品类 通常是实现了模板方法模式,也就是有模板方法和 ...

  6. 《深入设计模式》笔记 -创建型模式三、生成器模式(建造者模式)

    生成器模式 亦称:建造者模式.Builder 意图 生成器模式是一种创建型设计模式, 使你能够分步骤创建复杂对象. 该模式允许你使用相同的创建代码生成不同类型和形式的对象. 问题 假设有这样一个复杂对 ...

  7. Java建造者模式(生成器模式)

    基本介绍: 建造者模式又叫生成器模式,是一种对象构建模式.它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象 建造者模式是一步一步建造一个复杂 ...

  8. 不蹭热度了,传统生成器模式(建造者模式)——Builder Pattern

    不蹭热度了,传统生成器模式(建造者模式)--Builder Pattern 生成器模式 组成 Product IBuild Builder Director 总结 生成器模式 实际中,更新任何类都可以 ...

  9. 设计模式解密(6) - 建造者模式(生成器模式)

    1.简介 定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 分解一下定义: 1.复杂对象的表示: 2.复杂对象的构建过程: 3.可分离的通用构建过程,也适用于其它复杂对 ...

最新文章

  1. Cisco IOS版本命名规范
  2. Android Load Picture Asynchronously
  3. smarty模板引擎_6-Smarty的内置函数
  4. 计算机专业 程序员技术练级攻略(转载)
  5. android同步服务启动失败,android – FirebaseCloudMessaging:FirebaseInstanceId后台同步失败 – SERVICE_NOT_AVAILABLE...
  6. 零基础怎么玩转可视化大屏?这个工具只需5步!
  7. rust爱拍视频解说_抖音视频制作必备Mac神器,上热门儿不是事儿
  8. requestLayout invalidate postInvalidate
  9. 自己SSD近来经常掉盘,一看这一段时间SSD涨价很多啊
  10. 台湾“比基尼登山客”遗体运出 山友接其“回家”
  11. 1000亿资本“壕掷”!乡村旅游迎来黄金时代?
  12. 【问题解决方法】每次关闭XAMPP都会出现报错:Error:Cannot create file ‘E:\XAMPP\xampp-control.ini’
  13. 最好的PC端Android模拟器是哪个软件?
  14. pandas——分组与聚合
  15. 海思HI3516A千兆网卡换百兆网卡配置方法
  16. 明码(十进制转二进制,输出格式)
  17. java实现二叉树广度优先遍历_二叉树之深度优先和广度优先遍历(Java)
  18. 计算机接口电路的种类,接口电路的分类_接口电路的功能_接口电路的作用是什么...
  19. 例7.6有5个学生坐在一起,问第5个学生多少岁,他说比第4个学生大2岁。
  20. 反编译微信小程序错误: $gwx is not defined和__vd_version_info__ is not defined 已解决

热门文章

  1. WebDAV之葫芦儿·派盘+FX文件管理器
  2. 20年的嵌入式开发经验总结 !
  3. 平安夜,愿大家平安健康!
  4. stm32f105vct6例程_【STM32F105VCT6 PDF数据手册】_中文资料_引脚图及功能_(意法半导体 ST Microelectronics)-采芯网...
  5. 固定资产管理系统能给企业带来什么?
  6. 云呐|固定资产采购管理系统(资产采购管理有哪些功能)
  7. 计算机重装后不能启动怎么办,电脑重装系统后开不了机怎么处理
  8. 2021年最佳知识库软件指南
  9. allegro skill 选择和获取函数
  10. Pytorch 中的detach 和detach_