设计模式:建造者模式

目录

建造者模式(Builder Pattern)是一种创建型设计模式,它通过将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。该模式将对象的构建过程封装在一个独立的建造者类中,客户端通过指定不同的建造者来构建不同的对象。
在建造者模式中,有以下几个主要角色:

  1. 产品(Product):表示被构建的复杂对象。
  2. 建造者(Builder):定义了构建产品的抽象方法,可以有多个具体的建造者实现类。
  3. 指挥者(Director):负责使用建造者对象构建复杂对象,它并不知道具体的构建过程。
  4. 具体建造者(Concrete Builder):实现了建造者接口,负责具体产品的构建过程和组装。

代码

简单实现

java 复制代码
// Product class
class Product {
    private String partA;
    private String partB;
    private String partC;
    
     public void setPartA(String partA) {
        this.partA = partA;
    }
     public void setPartB(String partB) {
        this.partB = partB;
    }
     public void setPartC(String partC) {
        this.partC = partC;
    }
    
     public void show() {
        System.out.println("Product Parts:");
        System.out.println("Part A: " + partA);
        System.out.println("Part B: " + partB);
        System.out.println("Part C: " + partC);
    }
}
 // Builder interface
interface Builder {
    void buildPartA();
    void buildPartB();
    void buildPartC();
    Product getResult();
}
 // Concrete Builder
class ConcreteBuilder implements Builder {
    private Product product;
     public ConcreteBuilder() {
        this.product = new Product();
    }
     @Override
    public void buildPartA() {
        product.setPartA("Part A");
    }
     @Override
    public void buildPartB() {
        product.setPartB("Part B");
    }
     @Override
    public void buildPartC() {
        product.setPartC("Part C");
    }
     @Override
    public Product getResult() {
        return product;
    }
}
 // Director
class Director {
    public Product construct(Builder builder) {
        builder.buildPartA();
        builder.buildPartB();
        builder.buildPartC();
        return builder.getResult();
    }
}
 // Example usage
public class Main {
    public static void main(String[] args) {
        Builder builder = new ConcreteBuilder();
        Director director = new Director();
        Product product = director.construct(builder);
        product.show();
    }
}

以上是建造者模式在Java中的实现示例。通过使用建造者接口和具体建造者类,将复杂对象的构建过程与其表示分离。指挥者类负责使用建造者对象构建产品对象。最终通过调用建造者的getResult()方法获取构建好的产品对象,并进行展示。

常用使用方法

当对象中参数过多时,频繁的get和set很麻烦,我们可以用建造者模式改造

java 复制代码
public class Test {

    private String partA;
    private String partB;
    private String partC;
    private String partD;

    private Test(Builder builder) {
        partA = builder.partA;
        partB = builder.partB;
        partC = builder.partC;
        partD = builder.partD;
    }

    public static final class Builder {
        private String partA;
        private String partB;
        private String partC;
        private String partD;

        public Builder() {}

        public Builder partA(String val) {
            partA = val;
            return this;
        }
        public Builder partB (String val) {
            partB = val;
            return this;
        }
        public Builder partC (String val) {
            partC = val;
            return this;
        }
        public Builder partD (String val) {
            partD = val;
            return this;
        }
        public Test build() {
            return new Test(this);}
    }
    @Override
    public String toString() {
        return "Test{" +
                "partA ='" + partA + '\'' +
                ", partB ='" + partB + '\'' +
                ", partC ='" + partC + '\'' +
                ", partD ='" + partD + '\'' +
                '}';
    }
}

public class Client {
    public static void main(String[] args) {
        Test test = new Test.Builder()
                .partA ("partA")
                .partB ("partB ")
                .partC ("partC")
                .partD ("partD ")
                .build();
        System.out.println(test);
    }
}

注解方法使用建造者模式

我们可以使用lombok.Builder注解使用构造者模式

java 复制代码
@Data
@Builder
public class Test {
    private String partA;
    private String partB;
    private String partC;
    private String partD;
}

public class Client {
    public static void main(String[] args) {
        Test test = new Test.Builder()
                .partA ("partA")
                .partB ("partB ")
                .partC ("partC")
                .partD ("partD ")
                .build();
        System.out.println(test);
    }
}

总结

建造者模式的优点:

  1. 将复杂对象的构建过程与表示分离,使得同样的构建过程可以创建不同的表示。
  2. 隐藏了产品的内部结构,使得客户端只需要关注产品的高层接口。
  3. 可以更加精细地控制产品的构建过程,灵活性高。

建造者模式的缺点:

  1. 是增加了代码的复杂度,需要创建多个类来实现建造者、产品和指挥者角色,增加了系统的抽象性和理解难度。

总结来说,建造者模式适用于需要创建复杂对象,且创建过程中涉及多个步骤和部件的场景。它提供了一种灵活、可扩展的对象构建方式,并且可以隐藏产品的内部细节。

相关推荐
Lhappy嘻嘻27 分钟前
Java IO|File 文件操作 + 字节流 / 字符流完整笔记 + 递归删除文件实战
java·笔记·php
伊玛目的门徒1 小时前
试用leetcode之典中典 二数之和问题
java·算法·leetcode
懒鸟一枚4 小时前
深入理解 Linux 内存、Swap 交换分区与分页机制的关系
java·linux·数据库
我命由我123455 小时前
执行 Gradle 指令报错,无法将“grep”项识别为 cmdlet、函数、脚本文件或可运行程序的名称
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
考虑考虑5 小时前
Sentinel安装
java·后端·微服务
凤凰院凶涛QAQ7 小时前
《Java版数据结构 & 集合类剖析》栈与队列:“push/pop 是栈的灵魂,offer/poll 是队列的骨架——四组 API,两种人生”
java·开发语言·数据结构
掘金_答案8 小时前
上线那天,一个 ConcurrentHashMap 差点送走我的 AI 客服——3 天排查 JVM 血泪史
java·后端·架构
猿与禅8 小时前
CosId 分布式 ID 生成器完全教程:从架构原理到生产落地
java·shardingsphere·雪花算法·分布式id·高性能·cosid·号段模式
MindUp8 小时前
企业网盘权限模型解析:多层级访问控制与审计能力选型指南
java·linux·运维
NG4778 小时前
【软件设计与体系结构】-策略设计模式
java·设计模式·软件工程