设计模式之建造者模式

建造者模式

建造者模式(Builder Pattern)是一种创建型设计模式,它可以将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。该模式将对象的构建过程分解为多个简单的步骤,并将这些步骤按照特定的顺序进行组合,从而构建出不同的对象。

在Java中,建造者模式通常包含以下几个角色:

  1. 产品类(Product):表示被构建的复杂对象,包含多个部件;
  2. 抽象建造者类(Builder):定义了创建产品各个部件的抽象方法,以及返回产品的方法;
  3. 具体建造者类(ConcreteBuilder):实现了抽象建造者类中定义的所有方法,并且返回组装好的产品对象;
  4. 指挥者类(Director):负责调用具体建造者类中的方法来构建产品对象,它并不知道具体的建造细节。

使用建造者模式创建一份电脑配置清单:

Computer.java

java 复制代码
package com.sin.pojo;

/**
 * @createTime 2023/12/21 9:40
 * @createAuthor SIN
 * @use
 */
public class Computer {
    // cpu
    private String cpu;
    // 内存
    private String memory;
    // 磁盘
    private String hardDisk;

    public void setCpu(String cpu) {
        this.cpu = cpu;
    }

    public void setMemory(String memory) {
        this.memory = memory;
    }

    public void setHardDisk(String hardDisk) {
        this.hardDisk = hardDisk;
    }

    public String toString() {
        return "电脑: CPU=" + cpu + ", 内存=" + memory + ", 磁盘=" + hardDisk;
    }

}

ComputerBuilder.java

java 复制代码
package com.sin.builder;

import com.sin.pojo.Computer;

/**
 * @createTime 2023/12/21 9:45
 * @createAuthor SIN
 * @use 抽象建造者类
 */
public abstract class ComputerBuilder {
    protected Computer computer;

    // 创建CPU
    public abstract void buildCpu();
    // 创建内存
    public abstract void buildMemory();
    // 创建磁盘
    public abstract void buildHardDisk();

    public void createComputer(){
        computer = new Computer();
    }

    public Computer getComputer(){
        return computer;
    }
}

ComputerDirecter.java

java 复制代码
package com.sin.director;

import com.sin.builder.ComputerBuilder;

/**
 * @createTime 2023/12/21 9:53
 * @createAuthor SIN
 * @use 指挥者类
 */
public class ComputerDirector {
    private ComputerBuilder computerBuilder;

    public ComputerDirector(ComputerBuilder computerBuilder) {
        this.computerBuilder = computerBuilder;
    }

    public void constructComputer(){
        computerBuilder.createComputer();
        computerBuilder.buildCpu();
        computerBuilder.buildMemory();
        computerBuilder.buildHardDisk();
    }
}

HighEndComputerBuilder.java

java 复制代码
package com.sin.builder;

/**
 * @createTime 2023/12/21 9:50
 * @createAuthor SIN
 * @use 具体建造者
 */
public class HighEndComputerBuilder extends ComputerBuilder{
    @Override
    public void buildCpu() {
        computer.setCpu("英特尔酷睿i9");
    }

    @Override
    public void buildMemory() {
        computer.setMemory("32GB");
    }

    @Override
    public void buildHardDisk() {
        computer.setHardDisk("1TB");
    }
}

MidRangeComputerBuilder.java

java 复制代码
package com.sin.builder;

/**
 * @createTime 2023/12/21 9:52
 * @createAuthor SIN
 * @use
 */
public class MidRangeComputerBuilder extends ComputerBuilder{
    @Override
    public void buildCpu() {
        super.computer.setCpu("英特尔酷睿i5");
    }

    @Override
    public void buildMemory() {
        super.computer.setMemory("16GB");
    }

    @Override
    public void buildHardDisk() {
        super.computer.setHardDisk("500GB");
    }
}

SuperComputerBuilder.java

java 复制代码
package com.sin.builder;

/**
 * @createTime 2023/12/21 10:04
 * @createAuthor SIN
 * @use
 */
public class SuperComputerBuilder extends ComputerBuilder{
    @Override
    public void buildCpu() {
        super.computer.setCpu("AMD 锐龙5 5600G");
    }

    @Override
    public void buildMemory() {
        super.computer.setMemory("128GB");
    }

    @Override
    public void buildHardDisk() {
        super.computer.setHardDisk("10TB");
    }
}

BuilderPatternDemo.java

java 复制代码
package com.sin.demo;

import com.sin.builder.ComputerBuilder;
import com.sin.builder.HighEndComputerBuilder;
import com.sin.builder.MidRangeComputerBuilder;
import com.sin.builder.SuperComputerBuilder;
import com.sin.director.ComputerDirector;
import com.sin.pojo.Computer;

/**
 * @createTime 2023/12/21 9:55
 * @createAuthor SIN
 * @use
 */
public class BuilderPatternDemo {

    public static void main(String[] args) {
        ComputerDirector director;
        System.out.println("----------------高端电脑----------------");
        ComputerBuilder highEndBuilder = new HighEndComputerBuilder();
        director = new ComputerDirector(highEndBuilder);
        director.constructComputer();
        Computer highEndComputer = highEndBuilder.getComputer();
        System.out.println("高端电脑配置信息:"+highEndComputer);


        System.out.println("----------------低端电脑----------------");
        ComputerBuilder midRangeBuilder = new MidRangeComputerBuilder();
        director= new ComputerDirector(midRangeBuilder);
        director.constructComputer();
        Computer midRangeComputer = midRangeBuilder.getComputer();
        System.out.println("低端电脑配置信息:"+midRangeComputer);


        System.out.println("-------------------超级电脑---------------");
        ComputerBuilder superComputerBuilder = new SuperComputerBuilder();
        director= new ComputerDirector(superComputerBuilder);
        director.constructComputer();
        Computer superComputer = superComputerBuilder.getComputer();
        System.out.println("超级电脑配置信息:"+superComputer);
    }
}

优缺点

优点:

  1. 可以使得代码结构更加清晰,易于理解和维护。
  2. 可以使得产品的构建过程与其表示分离,使得相同的构建过程可以创建不同的产品表现形式。
  3. 可以控制产品对象的组装顺序,从而更加灵活地创建复杂的对象。
  4. 可以封装复杂对象的创建和部件之间的依赖关系,使得客户端不必了解具体产品内部的实现细节。

缺点:

  1. 建造者模式需要编写较多的代码,因此会增加系统的开销和复杂度。
  2. 如果产品内部发生变化,例如添加了一个新的部件,建造者模式的代码可能需要进行较大的修改。
  3. 在某些情况下,建造者模式可能不太适用,因为它要求产品必须有一个共同的接口或者抽象类,从而限制了产品的类型。
相关推荐
庸了个白38 分钟前
一种面向 AIoT 定制化场景的服务架构设计方案
mqtt·设计模式·系统架构·aiot·物联网平台·动态配置·解耦设计
Meteors.4 小时前
23种设计模式——访问者模式 (Visitor Pattern)
设计模式·访问者模式
Vallelonga5 小时前
Rust 设计模式 Marker Trait + Blanket Implementation
开发语言·设计模式·rust
en-route5 小时前
设计模式的底层原理——解耦
设计模式
杯莫停丶5 小时前
设计模式之:工厂方法模式
设计模式·工厂方法模式
Deschen6 小时前
设计模式-抽象工厂模式
java·设计模式·抽象工厂模式
粘豆煮包7 小时前
系统设计 System Design -4-2-系统设计问题-设计类似 TinyURL 的 URL 缩短服务 (改进版)
设计模式·架构
top_designer8 小时前
告别“静态”VI手册:InDesign与AE打造可交互的动态品牌规范
设计模式·pdf·交互·vi·工作流·after effects·indesign
非凡的世界9 小时前
深入理解 PHP 框架里的设计模式
开发语言·设计模式·php
一叶飘零_sweeeet9 小时前
深入 Spring 内核:解密 15 种设计模式的实战应用与底层实现
java·spring·设计模式