• 【建造者设计模式详解】Java/JS/Go/Python/TS不同语言实现


    简介

    建造者模式(Builder Pattern),也叫生成器模式,属于创建型模式。它使用多个简单的对象一步一步构建成一个复杂的对象。它允许你使用相同的创建代码生成不同类型和形式的对象。

    当你希望使用代码创建不同形式的产品 (例如各种商品和订单) 时, 一些基本部件不会变,而其组合经常变化的时候,就可以考虑建造者模式。

     

    作用

    1. 当需要创建复杂对象的时候,由各个部分的子对象来逐步构建,以适应复杂多变的情况。
    2. 具体的建造者类之间是相互独立的,这有利于系统的扩展。
    3. 将变与不变分离开。主管类隐藏了产品构造细节, 客户端只需要将一个生成器与主管类关联,就能从生成器处构造对象。

     

    实现步骤

    1. 定义主管类,可以制造所有形式的产品。
    2. 在基本生成器接口中声明创建产品的步骤。
    3. 为每个形式的产品创建具体生成器类,并实现其构造步骤。
    4. 客户端同时创建生成器和主管类,所有产品都遵循相同的接口,构造结果通过主管类获取。

     

    UML

     

     

    代码

     

    创建建造者接口

     

    复制代码
    // Builder.java 建造者接口,定义基本建造方法
    public interface Builder {
      public void reset();
      public void setName(String name);
      public void setScreen(Integer[] screen);
      public void setGPU(Integer no); 
    }
    复制代码

     

    具体建造者类,可以多个

    复制代码
    // ManualBuilder.java 使用手册建造者类也实现了建造者接口
    public class ManualBuilder implements Builder {
      private Manual manual;
    
      public void reset() {
        this.manual = new Manual();
      }
    
      public void setName(String name) {
        this.manual.setName(name);
      }
    
      public void setScreen(Integer[] screen) {
        this.manual.setScreen(screen);
      }
    
      public void setGPU(Integer no) {
        this.manual.setGpuType(no);
      }
    
      public Manual getProduct() {
        return this.manual;
      }
    }
    
    // PhoneBuilder.java 手机建造者实现了建造者接口
    public class PhoneBuilder implements Builder {
      private Phone phone;
    
      public void reset() {
        this.phone = new Phone();
      }
    
      public void setName(String name) {
        this.phone.setName(name);
      }
    
      public void setScreen(Integer[] screen) {
        this.phone.setScreen(screen);
      }
    
      public void setGPU(Integer no) {
        this.phone.setGpuType(no);
      }
    
      public Phone getProduct() {
        return this.phone;
      }
    }
    复制代码

     

     

    定义具体产品类,不同建造者建造不同产品

     

    复制代码
    // Manual.java 手册产品类
    public class Manual {
      private String name = "PhoneManualName";
      private Integer[] screen = { 0, 0 };
      private Integer gpuType = 0;
      private Integer pages = 0;
    
      public void setName(String name) {
        this.name = name;
      }
    
      public String getName() {
        return this.name;
      }
    
      public void setScreen(Integer[] screen) {
        this.screen = screen;
      }
    
      public Integer[] getScreen() {
        return this.screen;
      }
      ......
    
    }
    
    // Phone.java 手机产品类
    public class Phone {
      private String name = "PhoneName";
      private Integer[] screen = { 0, 0 };
      private Integer gpuType = 0;
    
      public void setName(String name) {
        this.name = name;
      }
    
      public String getName() {
        return this.name;
      }
    
      public void setScreen(Integer[] screen) {
        this.screen = screen;
      }
    
      public Integer[] getScreen() {
        return this.screen;
      }
      ......
    
    }
    复制代码

     

     

    指挥调度类

     

    复制代码
    // Director.java 指挥调度类,负责利用建造者建造产品,隔离需求与功能
    public class Director {
    
      // 建造phone1
      public void buildIPhone(Builder builder) {
        builder.reset();
        Integer[] screen = { 120, 500 };
        builder.setName("iPhone");
        builder.setScreen(screen);
        builder.setGPU(100);
      }
    
      // 建造phone2
      public void buildHuaweiPhone(Builder builder) {
        builder.reset();
        Integer[] screen = { 130, 600 };
        builder.setName("HuaweiPhone");
        builder.setScreen(screen);
        builder.setGPU(102);
      }
    
      // 建造phone3
      public void buildMiPhone(Builder builder) {
        builder.reset();
        Integer[] screen = { 120, 650 };
        builder.setName("MiPhone");
        builder.setScreen(screen);
        builder.setGPU(103);
      }
    
    }
    复制代码

     

     

    测试调用

     

    复制代码
        /**
         * 建造者模式是使用多个简单的对象一步一步构建出一个复杂的对象来。
         * 分为主管类和建造这类,主管类负责具体指挥调度,建造负责具体实施。
         * 主管类通过一步一步调用各种建造者实现复杂对象。
         */
    
        // 声明指挥者
        Director director = new Director();
        // 创建手机
        PhoneBuilder phoneBuilder = new PhoneBuilder();
        director.buildMiPhone(phoneBuilder);
        Phone miPhone = phoneBuilder.getProduct();
        System.out.println("miPhone:" + miPhone.getName() + " | " + miPhone.getGpuType().toString());
        // 创建手册
        ManualBuilder manualBuilder = new ManualBuilder();
        director.buildMiPhone(manualBuilder);
        Manual manual = manualBuilder.getProduct();
        System.out.println("manual:" + manual.getName() + " | " + manual.getGpuType().toString());
    复制代码
    
    

    更多语言版本

    不同语言实现设计模式:https://github.com/microwind/design-pattern

  • 相关阅读:
    基于Java毕业设计疫情期间的物资分派管理系统源码+系统+mysql+lw文档+部署软件
    优秀的Elasticsearch Java 客户端-Jest
    【译】.NET 7 中的性能改进(六)
    C#委托的个人理解和体悟
    PyQt5 QLabel控件
    gorm的自动化工具gen
    Apache Flink怎样保证数据是一致性的
    Stability AI推出Stable Audio;ChatGPT:推荐系统的颠覆者
    照明用哪种灯比较护眼?推荐专业的护眼照明灯
    vue自定义指令控制权限
  • 原文地址:https://www.cnblogs.com/letjs/p/17212355.html