【设计模式】建造者模式

103 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第22天,点击查看活动详情

【设计模式】建造者模式

概念

将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。

代码演示

  • A

    • 代码

       class Computer {
       ​
           private String cpu;
           private String gpu;
           private String memory;
           //硬盘
           private String hd;
           // set get tostring 省略
       }
       public static void main(String[] args) {
       ​
               Computer computer = new Computer();
               computer.setCpu("I5 8300H");
               computer.setGpu("1050Ti");
               computer.setMemory("16G");
               computer.setHd("256固态");
       ​
               System.out.println(computer);
           } 
      
    • 分析

      • 实例化好对象之后,必须为每一个属性赋值,太麻烦了。
      • 违反了迪米特法则。用户买电脑不需要知道这么多参数。
  • B (增加一个构造电脑类ComputerBuilder)

    • 代码

       class ComputerBuilder{
       ​
           private Computer computer = new Computer();
       ​
           public Computer builder(){
               computer.setCpu("I7 8750HK");
               computer.setGpu("3060Ti");
               computer.setMemory("32G");
               computer.setHd("1T固态");
               return computer;
           }
       }
      
    • 分析

      • 优点

        • 封装了创建对象的复杂过程
      • 缺点

        • 属性是固定的。
  • C

    • 代码 (B包基础上新增代码 如下)

       **
        * 中配
        */
       class MiddleComputerBuilder{
       ​
           private Computer computer = new Computer();
       ​
           public Computer builder(){
               computer.setCpu("I7 7700HQ");
               computer.setGpu("1060Ti");
               computer.setMemory("16G");
               computer.setHd("256固态");
               return computer;
       ​
           }
       ​
       }
       ​
       /**
        * 低配
        */
       class LowComputerBuilder{
       ​
           private Computer computer = new Computer();
       ​
           public Computer builder(){
               computer.setCpu("I5 7500U");
               computer.setGpu("GTX960");
               computer.setMemory("8G");
               computer.setHd("128T固态");
               return computer;
       ​
           }
       ​
       }
      
    • 分析

      • 优点

        • 根据不同的需求生产不同的产品
      • 缺点

        • 多个不同的建造者代码在重复 应该抽取出来
        • 建造过程不稳定,如果在某个建造者创建产品的过程中漏掉了某一步,编译器不会报错
  • D 继续优化

    • 代码 (C的基础上新增一个构造者接口 均实现该接口)

       //构造者接口
       interface ComputerBuilder{
           public void setCpu();
           public void setGpu();
           public void setMemory();
           public void setHd();
       ​
           public Computer builder();
       }
       /**
        * 高配
        */
       class AdvancedComputerBuilder implements ComputerBuilder{
       ​
           private Computer computer = new Computer();
       ​
           @Override
           public void setCpu() {
               computer.setCpu("I7 8750HK");
           }
       ​
           @Override
           public void setGpu() {
               computer.setGpu("3060Ti");
           }
       ​
           @Override
           public void setMemory() {
               computer.setMemory("32G");
           }
       ​
           @Override
           public void setHd() {
               computer.setHd("1T固态");
           }
       ​
           @Override
           public Computer builder() {
               return computer;
           }
       }
       public static void main(String[] args) {
       ​
               //打游戏
               System.out.println(new AdvancedComputerBuilder().builder());
       ​
               //开发
               System.out.println(new MiddleComputerBuilder().builder());
       ​
               //娱乐
               System.out.println(new LowComputerBuilder().builder());
           }
      
    • 分析

      • 优点 : 解决了C包中的问题。建造过程是稳定的。
      • 缺点: 用户建造之前需要手动调用多个set方法。
  • E (真正的建造者模式)

    • 代码 D基础上新增

       //指挥者
       class Director{
       ​
           //建造方法
           public Computer builder(ComputerBuilder computerBuilder){
       ​
               computerBuilder.setCpu();
               computerBuilder.setGpu();
               computerBuilder.setMemory();
               computerBuilder.setHd();
               return computerBuilder.builder();
           }
       ​
       }
       ​
       public class Test {
       ​
           public static void main(String[] args) {
       ​
               //打游戏
               System.out.println(new Director().builder(new AdvancedComputerBuilder()));
       ​
               //开发
               System.out.println(new Director().builder(new MiddleComputerBuilder()));
       ​
               //娱乐
               System.out.println(new Director().builder(new LowComputerBuilder()));
           }
       ​
       }
       ​
       ​
      
    • UML图

      image-20210717092030643

    • 分析

      • 优点

        • 建筑过程稳定,因为有接口。
        • 创建对象的过程写了一次,没有重复代码
        • 扩展时比较方便。不用修改之前的代码,符合开闭原则。

建造者与工厂模式

  • 工厂模式

    • 关注创建对象
  • 建造者

    • 关注建造对象之后的属性赋值问题。