什么是建造者模式

  • 意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
  • 主要解决

主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。

  • 何时使用

一些基本部件不会变,而其组合经常变化的时候。
当一个类的构造函数参数个数超过4个,而且这些参数有些是可选的参数,考虑使用构造者模式。

  • 如何解决:将变与不变分离开。
  • 关键代码:
    • 建造者:创建和提供实例
    • 导演:管理建造出来的实例的依赖关系。

简单来说就是:通过将多个简单对象通过一步步的组装构建出一个复杂对象的过程。即一个复杂的对象拆分成多个简单对象进行组装构建

话不多说,上代码

  • 案列描述
    还是拿小傅哥的案例吧,用的是装修,源码地址:itstack-demo-design

    • 装修都需要的物料
    • 构建各种套装,每个套装都是由上面的基本物料一个或者多个进行排列组合
  • 普通写法

 public String getMatterList(BigDecimal area, Integer level) {List<Matter> list = new ArrayList<Matter>(); // 装修清单BigDecimal price = BigDecimal.ZERO;          // 装修价格// 豪华欧式if (1 == level) {LevelTwoCeiling levelTwoCeiling = new LevelTwoCeiling(); // 吊顶,二级顶DuluxCoat duluxCoat = new DuluxCoat();                   // 涂料,多乐士ShengXiangFloor shengXiangFloor = new ShengXiangFloor(); // 地板,圣象list.add(levelTwoCeiling);list.add(duluxCoat);list.add(shengXiangFloor);price = price.add(area.multiply(new BigDecimal("0.2")).multiply(levelTwoCeiling.price()));price = price.add(area.multiply(new BigDecimal("1.4")).multiply(duluxCoat.price()));price = price.add(area.multiply(shengXiangFloor.price()));}// 轻奢田园if (2 == level) {LevelTwoCeiling levelTwoCeiling = new LevelTwoCeiling(); // 吊顶,二级顶LiBangCoat liBangCoat = new LiBangCoat();                // 涂料,立邦MarcoPoloTile marcoPoloTile = new MarcoPoloTile();       // 地砖,马可波罗list.add(levelTwoCeiling);list.add(liBangCoat);list.add(marcoPoloTile);price = price.add(area.multiply(new BigDecimal("0.2")).multiply(levelTwoCeiling.price()));price = price.add(area.multiply(new BigDecimal("1.4")).multiply(liBangCoat.price()));price = price.add(area.multiply(marcoPoloTile.price()));}// 现代简约if (3 == level) {LevelOneCeiling levelOneCeiling = new LevelOneCeiling();  // 吊顶,二级顶LiBangCoat liBangCoat = new LiBangCoat();                 // 涂料,立邦DongPengTile dongPengTile = new DongPengTile();           // 地砖,东鹏list.add(levelOneCeiling);list.add(liBangCoat);list.add(dongPengTile);price = price.add(area.multiply(new BigDecimal("0.2")).multiply(levelOneCeiling.price()));price = price.add(area.multiply(new BigDecimal("1.4")).multiply(liBangCoat.price()));price = price.add(area.multiply(dongPengTile.price()));}StringBuilder detail = new StringBuilder("\r\n-------------------------------------------------------\r\n" +"装修清单" + "\r\n" +"套餐等级:" + level + "\r\n" +"套餐价格:" + price.setScale(2, BigDecimal.ROUND_HALF_UP) + " 元\r\n" +"房屋面积:" + area.doubleValue() + " 平米\r\n" +"材料清单:\r\n");for (Matter matter: list) {detail.append(matter.scene()).append(":").append(matter.brand()).append("、").append(matter.model()).append("、平米价格:").append(matter.price()).append(" 元。\n");}return detail.toString();}
  • 建造者模式

    ···java
    LevelTwoCeiling levelTwoCeiling = new LevelTwoCeiling(); // 吊顶,二级顶
    DuluxCoat duluxCoat = new DuluxCoat(); // 涂料,多乐士
    ShengXiangFloor shengXiangFloor = new ShengXiangFloor(); // 地板,圣象

         list.add(levelTwoCeiling);list.add(duluxCoat);list.add(shengXiangFloor);price = price.add(area.multiply(new BigDecimal("0.2")).multiply(levelTwoCeiling.price()));price = price.add(area.multiply(new BigDecimal("1.4")).multiply(duluxCoat.price()));price = price.add(area.multiply(shengXiangFloor.price()));
    
    
    
  • 普通写法基本上都是复用上面这个代码块 ,那如何优化简写呢?

  • 结构说明

  • DecorationPackageMenu类

package org.itstack.demo.design;import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;/*** 装修包*/
public class DecorationPackageMenu {// 装修清单(多个基础物料)private List<Matter> list = new ArrayList<Matter>();// 装修价格private BigDecimal price = BigDecimal.ZERO;// 面积private BigDecimal area;// 装修等级;豪华欧式、轻奢田园、现代简约private String grade;private DecorationPackageMenu() {}public DecorationPackageMenu(Double area, String grade) {this.area = new BigDecimal(area);this.grade = grade;}// 多个改成了单个public DecorationPackageMenu appendMatter(Matter matter) {list.add(matter);price = price.add(area.multiply(new BigDecimal("0.2")).multiply(matter.price()));return this;}public String getDetail() {StringBuilder detail = new StringBuilder("\r\n-------------------------------------------------------\r\n" +"装修清单" + "\r\n" +"套餐等级:" + grade + "\r\n" +"套餐价格:" + price.setScale(2, BigDecimal.ROUND_HALF_UP) + " 元\r\n" +"房屋面积:" + area.doubleValue() + " 平米\r\n" +"材料清单:\r\n");for (Matter matter: list) {detail.append(matter.scene()).append(":").append(matter.brand()).append("、").append(matter.model()).append("、平米价格:").append(matter.price()).append(" 元。\n");}return detail.toString();}}
  • builder类
package org.itstack.demo.design;import org.itstack.demo.design.ceiling.LevelOneCeiling;
import org.itstack.demo.design.ceiling.LevelTwoCeiling;
import org.itstack.demo.design.coat.DuluxCoat;
import org.itstack.demo.design.coat.LiBangCoat;
import org.itstack.demo.design.floor.ShengXiangFloor;
import org.itstack.demo.design.tile.DongPengTile;
import org.itstack.demo.design.tile.MarcoPoloTile;public class Builder {public DecorationPackageMenu levelOne(Double area) {return new DecorationPackageMenu(area, "豪华欧式").appendMatter(new LevelTwoCeiling())    // 吊顶,二级顶.appendMatter(new DuluxCoat())             // 涂料,多乐士.appendMatter(new ShengXiangFloor());     // 地板,圣象}public DecorationPackageMenu levelTwo(Double area){return new DecorationPackageMenu(area, "轻奢田园").appendMatter(new LevelTwoCeiling())   // 吊顶,二级顶.appendMatter(new LiBangCoat())           // 涂料,立邦.appendMatter(new MarcoPoloTile());       // 地砖,马可波罗}public DecorationPackageMenu levelThree(Double area){return new DecorationPackageMenu(area, "现代简约").appendMatter(new LevelOneCeiling())   // 吊顶,二级顶.appendMatter(new LiBangCoat())           // 涂料,立邦.appendMatter(new DongPengTile());        // 地砖,东鹏}}

使用设计模式后,一眼就能看到有啥物料构成,也利于以后扩展


  • 结尾–广告推广

倚天屠龙之建造者模式相关推荐

  1. GOF23设计模式(创建型模式)建造者模式

    使用场景: 我们要建造一个复杂的产品,比如生产一辆汽车.一部手机,这都是由很多零部件组成的,这时候就需要用到我们的建造者模式,将每个零部件分别生产,然后再装配~~ 以下,我将以一个手机的生产过程为实例 ...

  2. 设计模式 之美 -- 建造者模式

    文章目录 1. 解决问题 2. 应用场景 3. 实现 C语言实现 C++实现 4. 缺点 1. 解决问题 描述如下场景: 类的数据成员很多(8个以上),当我们进行初始化的时候放在初始化列表中,影响类的 ...

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

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

  4. 动态表单构建器——建造者模式

    在编写一个弹出框时,它可以包含确定按钮,取消按钮,标题栏,关闭按钮,最小化按钮,内容,最大化按钮等内容,但这些内容在不同的需求下又不是必须存在的,不同的需求需要对这些组件自由组合,显然每次组合都要重复 ...

  5. Python设计模式-建造者模式

    Python设计模式-建造者模式 代码基于3.5.2,代码如下; #coding:utf-8 #建造者模式 class Burger():name = ""price = 0.0d ...

  6. 设计模式-建造者模式(05)

    定义 建造者模式(Builder Pattern)也叫做生成器模式.英文原话是:Separate the construction of a complex object from its repre ...

  7. php设计模式 - 建造者模式

    为什么80%的码农都做不了架构师?>>>    <?php /*** 建造者模式* * 将一个复杂对象的构建与它的表示分离,使用同样的构建过程可以创建不同的表示 */ clas ...

  8. java中自造类是什么意思_Java建造者模式是什么?如何实现?(附代码)

    本篇文章给大家带来的内容是关于Java建造者模式是什么?如何实现?(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 建造者模式 一.什么是建筑者模式? 建造者模式(Build ...

  9. 建造者模式java_java设计模式3——建造者模式

    java设计模式3--建造者模式 1.建造者模式介绍: 建造者模式属于创建型模式,他提供了一种创建对象得最佳方式 定义: 将一个复杂对象的构建和与它的表示分离,使得同样的构建过程可以创建不同的表示 主 ...

最新文章

  1. iis 程序池设置及详解-20180720
  2. 经济学中的定量分析python_(转)Python中的结构化数据分析利器-Pandas简介
  3. #每日一题:小数第n位(数论/模拟)
  4. Hive的数据加载与导出
  5. ubuntu安装禅道
  6. 在计算机网络应用发展过程中 被称为,计算机网络技术与应用第三章考试题
  7. java把含小数点的数字字符串转换为int类型
  8. 编程算法/面试 - K链表翻转
  9. css背景透明度不影响文字_唯美文字背景图 | 生活不一定很酷
  10. order调用mdp
  11. 原创:协同过滤之ALS
  12. Java (do while)
  13. NG2-我们创建一个可复用的服务来调用英雄的数据
  14. java sql 字符串_java用字符串拼接SQL语句的特殊字符转义问题
  15. CIS Benchmarks
  16. 4 实型变量,字符型数据(常量和变量),字符串常量2021-01-25
  17. USB-HID游戏手柄的数据通信
  18. pylint高频警告错误的原因及处理建议
  19. 感性女生和理性男生的区别
  20. 用什么擦地最干净脑筋急转弯_小学生语文试卷:为什么秋天大雁要飞回南方?答案让人“喷饭”...

热门文章

  1. 2021 中国软件 100 强,腾讯第二、百度第三,第一竟然是他!
  2. “辽宁号航空母舰”模型亮相南京
  3. Read Aloud: 文本语音朗读助理
  4. Android中Binder通讯机制详解
  5. 【Android 屏幕适配】屏幕适配基础概念 ③ ( 屏幕像素密度 DPI 与素材大小关联 | 屏幕像素密度 DPI 与 屏幕密度限定符关联 )
  6. Python定时自动更换电脑壁纸
  7. 基于YOLOv5的目标检测系统详解(附MATLAB GUI版代码)
  8. CMMI流程规范-外包与采购管理
  9. 区分原生IP和广播IP
  10. java基础多线程抢红包_高并发开发-微信抢红包实现