设计模式:建造者模式

2023-09-12 21:00:25


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

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

代码

简单实现

// 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很麻烦,我们可以用建造者模式改造

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注解使用构造者模式

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

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

更多推荐

OSI模型与数据的封装

1、OSI模型上层||七层模型四层模型||应用层|表示层应用层http/ftp/ssh/ftps|会话层-----------------------------------------------------------------------|·传输层传输层tcp/udp----------------------

推荐几款优秀的项目报表软件

项目报表在项目工作中扮演着重要的角色,它是领导和客户了解项目进况的直接途径。有需求就会有市场,为解决传统报表制作复杂困难的问题,专业报表工具应运而生。一款好用的项目报表软件可以帮助项目团队快速产出项目报表,实现数据可视化,进行高效的项目数据分析。有什么好用的项目报表软件?在琳琅满目的项目报表软件产品中,有什么好用的项目

Linux开发工具之项目自动化构建工具-make/Makefile

make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建makefile带来的好处就是自动化编译,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率下面来看一个实例:在Makefile文件里可以如上图一样g++/gcc编译代码一步到位,也可以如下图一样,一步一步拆

滨州ITSS认证流程,认证条件

ITSS认证流程,认证条件一、ITSS的意义ITSS认证——信息技术服务标准,是在工业和信息化部、国家标准化委的领导和支持下,由ITSS工作组研制的一套IT服务领域的标准库和一套提供IT服务的方法论。ITSS认证-信息技术服务标准是一套成体系和综合配套的信息技术服务标准库,全面规范了IT服务产品及其组成要素,用于指导实

css --- 让人上头的flex

用自己的理解记录下flex的知识点,部分文字描述是在学习其他作者分享的文章觉得很好而使用的,不是无脑搬运,是学习和借鉴!一、基本原理二、flex容器和项目三、轴线四、flex属性4.1属性汇总4.2属性分类4.3属性详解(1)flex-direction(2)flex-wrap(3)flex-flow(4)justif

VLAN的配置实例

基于端口的vlan划分以下配置为例:注意选择copper线,可以任意选择端口PC配置如下:LSW1配置如下[LSW1]vlan10[LSW1-vlan10]qu[LSW1]interfaceg0/0/9[LSW1-Gigabitethernet0/0/9]portlink-typeacces[LSW1-Gigabite

【脑机接口论文与代码】 基于自适应FBCCA的脑机接口控制机械臂

Brain-ControlledRoboticArmBasedonAdaptiveFBCCA基于自适应FBCCA的脑机接口控制机械臂论文下载:算法程序下载:摘要1项目介绍2方法2.1CCA算法2.2FBCCA算法2.3自适应FBCCA算法3数据获取4结果4.1脑地形图4.2频谱图4.3准确率5结论基于自适应FBCCA的

2023最新如何轻松升级、安装和试用Navicat Premium 16.2.10 教程详解

🌷🍁博主猫头虎(🐅🐾)带您GotoNewWorld✨🍁🦄博客首页——🐅🐾猫头虎的博客🎐🐳《面试题大全专栏》🦕文章图文并茂🦖生动形象🐅简单易学!欢迎大家来踩踩~🌺🌊《IDEA开发秘籍专栏》🐾学会IDEA常用操作,工作效率翻倍~💐🌊《100天精通Golang(基础入门篇)》🐅学会Gol

Linux学习第16天:Linux设备树下的LED驱动开发:举一反三 专注专心专业

Linux版本号4.1.15芯片I.MX6ULL大叔学Linux品人间百味思文短情长在开题之前,先说一下这次的题目,尤其是后面的“举一反三专注专心专业”到底想给大家传递什么信息。LED驱动开发,目前为止已经学了好几种方法,包括裸机开发、嵌入式LinuxLED驱动开发以及基于API函数的LED驱动开发,再加上今天要学习的

基于Java的养老院管理系统的设计与实现(亮点:多角色、登录验证码、留言反馈)

养老院管理系统一、前言二、我的优势2.1自己的网站2.2自己的小程序(小蔡coding)2.3有保障的售后2.4福利三、开发环境与技术3.1MySQL数据库3.2Vue前端技术3.3SpringBoot框架3.4微信小程序四、功能设计4.1主要功能描述五、系统实现5.1养老院老人功能5.1.1饮食喜好5.1.2体检结果

为何学linux及用处

目前企业使用的操作系统无非就是国产类的,windows和linux类。我们要提升自己的技能,需要学习这两款。我记得在大学时期,学习过windows以及linux,但当时觉得又不常用,就学的模棱两可。毕业之后,你会发现,其实这两种操作系统是很主流的。为什么学?下面就是一些工作中遇到的例子分享一下。我记得在企业中有次遇到数

热文推荐