What:

建造者模式是将一个复杂的对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。建造者模式隐藏了复杂对象的创建过程,它把复杂对象的创建过程加以抽象,通过子类继承或者重载的方式,动态的创建具有复合属性的对象。

Why:

优点:

1.遵循开闭原则。
2.对象的建造和表示分离,实现了解耦。
3.隐藏了对象的建造细节,用户只需关心产品的表示,而不需要了解是如何创建产品的。

缺点:

1.如果构造者多,会有很多的建造类,难以维护。
2.产品的组成部分必须相同,这限制了其使用范围。

Where:

1.隔离复杂对象的创建和使用,相同的方法,不同执行顺序,产生不同事件结果
2.需要生成的产品对象的属性相互依赖,需要指定其生成顺序。

How:

在学习使用建造者模式之前,我们需要了解几个概念。

Product:具体的产品。
Builder:抽象的建造方法。
ConcreteBuilder:具体的建造者。
Director(指挥官):调用具体构造者创建的产品对象,负责将客户端传来指令交给具体的建造者。

主要有以下两种方式设计建造者模式:

一、通过Product,Builder,ConcreteBuilder,Director设计的建造者模式

ComputerElement类:具体的对象

/*** 计算机元件*/
public class ComputerElement {private String CPU;private String mainboard;private String memory;private String SSD;private String power;private String computerCase;public ComputerElement() {}public ComputerElement(String CPU, String mainboard, String memory, String SSD, String power, String computerCase) {this.CPU = CPU;this.mainboard = mainboard;this.memory = memory;this.SSD = SSD;this.power = power;this.computerCase = computerCase;}@Overridepublic String toString() {final StringBuilder sb = new StringBuilder("电脑组装元件如下:\n");sb.append("CPU:").append(CPU).append('\n');sb.append("主板:").append(mainboard).append('\n');sb.append("内存:").append(memory).append('\n');sb.append("SSD:").append(SSD).append('\n');sb.append("电源:").append(power).append('\n');sb.append("机箱:").append(computerCase).append('\n');sb.append("正在组装中...").append('\n');sb.append("组装完成!").append('\n');return sb.toString();}// 省略get、set方法}

ComputerBuilder:抽象的建造方法

/*** 组装电脑抽象建造者*/
public interface ComputerBuilder {ComputerBuilder buildCPU(String CPU);ComputerBuilder buildMainboard(String mainboard);ComputerBuilder buildMemory(String memory);ComputerBuilder buildSSD(String SSD);ComputerBuilder buildPower(String power);ComputerBuilder buildComputerCase(String computerCase);ComputerElement build();
}

ComputerActualBuilder:具体的建造者

/*** 组装电脑具体建造者*/
public class ComputerActualBuilder implements ComputerBuilder {ComputerElement computerElement = new ComputerElement();@Overridepublic ComputerBuilder buildCPU(String CPU) {computerElement.setCPU(CPU);return this;}@Overridepublic ComputerBuilder buildMainboard(String mainboard) {computerElement.setMainboard(mainboard);return this;}@Overridepublic ComputerBuilder buildMemory(String memory) {computerElement.setMemory(memory);return this;}@Overridepublic ComputerBuilder buildSSD(String SSD) {computerElement.setSSD(SSD);return this;}@Overridepublic ComputerBuilder buildPower(String power) {computerElement.setPower(power);return this;}@Overridepublic ComputerBuilder buildComputerCase(String computerCase) {computerElement.setComputerCase(computerCase);return this;}@Overridepublic ComputerElement build() {return computerElement;}
}

ComputerDirector:指挥官

/*** 指挥官*/
public class ComputerDirector {private ComputerBuilder computerBuilder = new ComputerActualBuilder();public ComputerElement build(String CPU, String mainboard, String memory, String SSD, String power, String computerCase) {return computerBuilder.buildMainboard(mainboard).buildCPU(CPU).buildSSD(SSD).buildMemory(memory).buildPower(power).buildComputerCase(computerCase).build();}
}

Test:测试方法

public class Test {public static void main(String[] args) {ComputerDirector director = new ComputerDirector();System.out.println(director.build("Intel酷睿六核处理器i5-8400","Intel B360","16G","1T","美商海盗船","机箱"));}
}

输出结果:

电脑组装元件如下:
CPU:Intel酷睿六核处理器i5-8400
主板:Intel B360
内存:16G
SSD:1T
电源:美商海盗船
机箱:普通机箱
正在组装中...
组装完成!

二、通过静态内部类方式设计的建造者模式:

public class ComputerDIY {private String CPU;private String mainboard;private String memory;private String SSD;private String power;private String computerCase;public ComputerDIY(ComputerBuilder computerBuilder) {this.CPU = computerBuilder.CPU;this.mainboard = computerBuilder.mainboard;this.memory = computerBuilder.memory;this.SSD = computerBuilder.SSD;this.power = computerBuilder.power;this.computerCase = computerBuilder.computerCase;}public String diy(){final StringBuilder sb = new StringBuilder("电脑配置如下:\n");sb.append("     CPU:").append(CPU).append('\n');sb.append("     主板:").append(mainboard).append('\n');sb.append("     内存:").append(memory).append('\n');sb.append("     SSD:").append(SSD).append('\n');sb.append("     电源:").append(power).append('\n');sb.append("     机箱:").append(computerCase).append('\n');sb.append("正在组装中...").append('\n');sb.append("组装完成!").append('\n');return sb.toString();}@Overridepublic String toString() {final StringBuilder sb = new StringBuilder("{");sb.append("\"CPU\":\"").append(CPU).append('\"');sb.append(",\"mainboard\":\"").append(mainboard).append('\"');sb.append(",\"memory\":\"").append(memory).append('\"');sb.append(",\"SSD\":\"").append(SSD).append('\"');sb.append(",\"power\":\"").append(power).append('\"');sb.append('}');return sb.toString();}public static class ComputerBuilder{private String CPU;private String mainboard;private String memory;private String SSD;private String power;private String computerCase;public ComputerBuilder buildCPU(String CPU) {this.CPU = CPU;return this;}public ComputerBuilder buildMainboard(String mainboard) {this.mainboard = mainboard;return this;}public ComputerBuilder buildMemory(String memory) {this.memory = memory;return this;}public ComputerBuilder buildSSD(String SSD) {this.SSD = SSD;return this;}public ComputerBuilder buildPower(String power) {this.power = power;return this;}public ComputerBuilder buildComputerCase(String computerCase) {this.computerCase = computerCase;return this;}public ComputerDIY build() {return new ComputerDIY(this);}}
}
public class Test {public static void main(String[] args) {ComputerDIY computerDIY = new ComputerDIY.ComputerBuilder().buildCPU("Intel酷睿六核处理器i5-8400").buildMainboard("Intel B360").buildMemory("16G").buildSSD("16G").buildPower("美商海盗船").buildComputerCase("普通机箱").build();System.out.println(computerDIY.diy());}
}

输出结果:

电脑配置如下:CPU:Intel酷睿六核处理器i5-8400主板:Intel B360内存:16GSSD:16G电源:美商海盗船机箱:普通机箱
正在组装中...
组装完成!

总结

建造者模式适合于创建的对象较复杂,由多个部件构成,各部件面临着复杂的变化,但构件间的建造顺序是稳定的;创建复杂对象的算法独立于该对象的组成部分以及它们的装配方式,即产品的构建过程和最终的表示是独立的。

了解更多设计模式:

设计模式系列

设计模式之建造者模式(Builder Pattern)相关推荐

  1. Python 设计模式之建造者模式 Builder Pattern

    #引入建造者模式 肯德基的菜单上有 薯条, 鸡腿,鸡翅,鸡米花,可乐,橙汁,火腿汉堡,至尊虾汉堡,牛肉汉堡 , 鸡肉卷等这些单品,也有很多套餐. 比如 套餐1:鸡翅,至尊虾汉堡,可乐,薯条 套餐2:鸡 ...

  2. UE4 C++设计模式:建造者模式(Builder Pattern)

    目录 描述 套路 使用场景 优缺点 UE4实践 具体复杂产品-门派角色 抽象建造者-角色构造器 具体建造者-纯阳角色构造器 具体建造者-七秀角色构造器 创建指挥者(Director)-角色创建指挥器 ...

  3. Android设计模式之建造者模式builder

    今天小编来说一下Android中的一种设计模式--建造者模式Builder 绪论: 那么对于Android初级来说,Builder设计模式可能在我们开发中用过的很少,但是我们可能见过,我们经常用的Al ...

  4. 设计模式(创建型)之建造者模式(Builder Pattern)

    PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbob ...

  5. Net设计模式实例之建造者模式(Builder Pattern)(2)

    四.案例分析(Example) 1.场景 假设房子只有房顶和墙(Roof And Walls)<?XML:NAMESPACE PREFIX = O /> Jane和 Joe两个客户需要从建 ...

  6. 大厦设计师 -- 建造者模式 (Builder Pattern) 介绍 使用案例场景分析 优缺点 及代码演示

    一句话概括: 使用多个简单对象一步一步构建成复杂对象,将复杂对象的构建与表示相分离. 补充介绍: 建造者模式(Builder Pattern)中有一个 Builder 类,这个类会一步一步构造最终的对 ...

  7. 07、人人都会设计模式:建造者模式--Builder

    PS:转载请注明出处 作者: TigerChain 地址: http://www.jianshu.com/p/300cbb9ee7f2 本文出自 TigerChain 简书 人人都会设计模式 教程简介 ...

  8. 二十三种设计模式[3] - 生成器模式(Builder Pattern)

    前言 生成器,又名建造者模式,属于创建型模式.在<设计模式 - 可复用的面向对象软件>一书中对它的描述为" 将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表 ...

  9. C++设计模式之建造者模式(builder)(创建型)

    软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径.设计模式中运用了面向对象编程语言的重要特性:封装.继承.多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累. ...

  10. 一天一个设计模式之建造者模式(Builder)

    建造者模式,属于创建型模式,其目的在于将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 适用情况: • 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时. ...

最新文章

  1. 《OpenCV3编程入门》学习笔记2 启程前的认知准备
  2. LLVM 与 Clang 介绍 — LinuxTOY
  3. 频段表_VoLTE高低频段覆盖能力研究
  4. java商城_java开源商城系统的优势是什么?
  5. 蜗牛星际 --【功耗测量】
  6. Android setBackgroundResource和setBackgroundDrawable和用法
  7. 如何使用HTML5创建在线精美简历
  8. 视觉SLAM笔记(38) 3D-3D: ICP
  9. VMware VSphere 引发的学案(三)
  10. 跨server传输数据注意事项
  11. 公司的摄像头密码要统一
  12. SVN:下载、安装和中文设置
  13. Spring揭秘 读书笔记
  14. 数据的分析的方法及评价指标总结
  15. java中display中的属性_全面解析display属性
  16. 华商网H.S.W社团:寻找有创造力的陕西大学生
  17. PPT文件不能编辑如何解决?
  18. TypeError Cannot instantiate abstract class xxx with abstract method
  19. C语言 sigchild回收子进程
  20. hint ksql oracle_性能测试中发现oracle11g数据库每天22点,oralce进程CPU占用率突增

热门文章

  1. 6.0、软件测试——判定表法
  2. STM32F103驱动GT911
  3. 2021-12-13 股票模拟交易心得8
  4. C#仿QQ皮肤_写作说明
  5. 10块钱怎么较为平均分给三个人
  6. ClownFish:比手写代码还快的通用数据访问层
  7. entity、model、domain三个包之间的区别
  8. ubantu下载源详细目录
  9. Windows漏洞利用技术概述
  10. 2022年最好用的蓝牙耳机,2022性价比最高的蓝牙耳机品牌