Java设计模式之一:建造者模式_java 建造者模式-程序员宅基地

技术标签: java  建造者模式  设计模式  

目录

一、什么是建造者模式

二、建造者模式如何使用

三、建造者模式的优势和应用场景


一、什么是建造者模式

Java建造者模式是一种创建对象的设计模式,它通过将对象的构造过程分离出来,使得同样的构建过程可以创建不同的表示。建造者模式适用于创建复杂对象,它将对象的构建过程分解成多个步骤,每个步骤由一个具体的建造者来负责,最终由一个指挥者来组装这些部件。

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

  1. 产品(Product):表示被构建的复杂对象,包含多个组成部分。
  2. 抽象建造者(Builder):定义对象的构建步骤和接口,具体建造者需要实现这个接口来创建不同的产品。
  3. 具体建造者(Concrete Builder):实现抽象建造者接口,负责具体的构建过程,包括构建各个部件和返回最终构建的产品。
  4. 指挥者(Director):负责调用具体建造者的方法来构建产品,控制构建的流程和顺序。

使用建造者模式可以将复杂对象的构建过程与表示分离,使得同样的构建过程可以创建不同的表示,提高了代码的复用性和灵活性。同时,建造者模式也可以隐藏产品的构建细节,使得客户端不需要知道具体的构建过程,只需要通过指挥者来创建产品即可。

 

二、建造者模式如何使用

以下是一个使用Java建造者模式的示例代码:
 

// 产品类
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("Part A: " + partA);
        System.out.println("Part B: " + partB);
        System.out.println("Part C: " + partC);
    }
}

// 抽象建造者
interface Builder {
    void buildPartA();
    void buildPartB();
    void buildPartC();
    Product getResult();
}

// 具体建造者
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;
    }
}

// 指挥者
class Director {
    private Builder builder;

    public Director(Builder builder) {
        this.builder = builder;
    }

    public void construct() {
        builder.buildPartA();
        builder.buildPartB();
        builder.buildPartC();
    }
}

// 客户端代码
public class BuilderPatternExample {
    public static void main(String[] args) {
        Builder builder = new ConcreteBuilder();
        Director director = new Director(builder);
        director.construct();
        Product product = builder.getResult();
        product.show();
    }
}

在以上示例中,我们定义了一个产品类。


Product,其中包含了三个部件partApartBpartC。抽象建造者Builder定义了产品的构建步骤和接口,具体建造者ConcreteBuilder实现了抽象建造者接口,并负责具体的构建过程。指挥者Director负责调用具体建造者的方法来构建产品,控制构建的流程和顺序。

在客户端代码中,我们创建了一个具体建造者ConcreteBuilder的实例,并将其传递给指挥者Director。然后调用指挥者的construct()方法来构建产品,最后通过具体建造者的getResult()方法获取构建完成的产品。最终调用产品的show()方法展示产品的部件信息。


三、建造者模式的优势和应用场景

  •  建造者模式的优势
  1. 将复杂对象的创建过程封装在具体的建造者中,使得代码结构清晰,易于理解和维护。
  2. 可以通过改变具体建造者来创建不同的产品表示,灵活性高。
  3. 隐藏了产品的构建细节,使客户端不需要关心具体的建造过程,只需要通过指挥者来获取最终的产品。
  • 建造者模式的应用场景
  1. 当对象的构建过程较为复杂,需要多个步骤,并且可以有不同的表示时,可以考虑使用建造者模式。
  2. 当需要创建的对象包含多个部分,并且这些部分之间有一定的依赖关系时,可以使用建造者模式来确保部件的组装顺序和正确性。
  3. 当希望隐藏对象的构建细节,只向客户端暴露一个简单的构建接口时,可以使用建造者模式。
  4. 当需要创建的对象具有复杂的内部结构,但外部只需要关注其高层次的表示时,可以使用建造者模式。

总的来说,建造者模式适用于构建过程复杂、对象组成部分多且可变、希望隐藏构建细节的场景,能够提高代码的可读性、灵活性和可维护性。

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yangyin1998/article/details/131594623

智能推荐

TheiSfM - Win7/VS2015/CMake_theia-sfm-程序员宅基地

文章浏览阅读1k次。Instruction for building TheiaSfM._theia-sfm

linux下安装mysql-5.7.25详细步骤_mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz下载-程序员宅基地

文章浏览阅读458次。第一步:下载进入到mysql官网下载自己对应版本的mysql,下载地址:https://dev.mysql.com/downloads/mysql/5.7.html#downloads我这里下载mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz版本也可以进入linux后用命令下载wget https://cdn.mysql.com//Downloads..._mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz下载

HDU 4348 SPOJ TTM To the moon(操作建树)_to the moon操作-程序员宅基地

文章浏览阅读388次。题意:给出一个序列,四种操作C l r d: Adding a constant d for every {Ai | l <= i <= r}, and increase the timestamp by 1, this is the only operation that will cause the timestamp increase. Q l r: Querying the current_to the moon操作

基于docker-compose做版本升级_升级 docker-compose-程序员宅基地

文章浏览阅读283次。将mysql的镜像导出成tar文件到当前文件夹。docker-compose.yml文件。#离线做mysql升级。_升级 docker-compose

出现java.lang.NumberFormatException: null的错我如何解决_numberformatexception null-程序员宅基地

文章浏览阅读469次。首先这是show.jsp pageEncoding="UTF-8"%><!DOCTYPE html><html><head><meta charset="UTF-8"><title>Insert title here</title></head><body><% request.setCharacterEncoding("utf-8"); String name = r_numberformatexception null

linux重定向总结_linux文件的重定向顺序是从左到右-程序员宅基地

文章浏览阅读2.8k次,点赞3次,收藏24次。转载:https://www.cnblogs.com/520playboy/p/6275022.html背景我们经常能在shell脚本中发现&gt;/dev/null 2&gt;&amp;1这样的语句。以前的我并没有去深入地理解这段命令的作用,照搬照用,直到上周我将这段命令不小心写成了2&gt;&amp;1 &gt;/dev/null,出了一点小问题之后,我才开始去了解这段命令背后的“玄机”。sh..._linux文件的重定向顺序是从左到右

随便推点

QA面试题-程序员宅基地

文章浏览阅读880次,点赞19次,收藏17次。猴子测试是一种用于测试应用程序的黑盒测试,通过提供随机输入来检查系统行为,例如检查系统是否崩溃。测试主管通常会准备它,或者测试经理,文档的重点是描述要测试什么,如何测试什么时候测试,谁来做什么测试。我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。猴子测试和即席测试都遵循非正式的方法,但是在猴子测试中,我们不需要对软件有深入的了解。它是最终测试,同时执行功能性和非功能性测试。

UniCode转UTF8-程序员宅基地

文章浏览阅读79次。char *UniCodeToUTF8(CString strUniCode){ LPWSTR pWstr = new wchar_t[strUniCode.GetLength() + 1]; wcscpy(pWstr, T2W((LPTSTR)strUniCode.GetString())); //获取转完后的长度 int nLen = WideCh..._utf8_ai

dfsadmin -report结果分析_dfsadmin -report详解-程序员宅基地

文章浏览阅读5.5k次。最近在搭建hadoop集群实验中,启动集群时常报错:jobtracker.info could only be replicated to 0 nodes, instead of 1查了好多资料,用了好多方式尝试解决,通过下面的命令总有找到问题所在了。原因:Configured Capacity也就是datanode 没用分配容量 [root@dev9106 bin]# ./ha_dfsadmin -report详解

Spring框架+Struts2框架第一次整合_spring框架 struts2-程序员宅基地

文章浏览阅读747次。1:Spring框架和Struts2框架如何整合???  Spring 负责对象创建  Struts2 用Action处理请求2:Spring与Struts2框架整合的关键点:  让struts2框架action对象的创建,交给Spring完成3:Spring框架和Struts2框架开发步骤:  (1):引入Struts2框架的相关jar包  (2):引入Spring框_spring框架 struts2

Spring Cloud Zuul:API网关服务-程序员宅基地

文章浏览阅读1k次,点赞13次,收藏22次。API网关为微服务架构中的服务提供了统一的访问入口,客户端通过API网关访问相关服务。API网关的定义类似于设计模式中的门面模式,它相当于整个微服务架构中的门面,所有客户端的访问都通过它来进行路由及过滤。它实现了请求路由、负载均衡、校验过滤、服务容错、服务聚合等功能。接下来我们自定义一个过滤器来演示下过滤器的作用。

前端学习之路之CSS (一)-程序员宅基地

文章浏览阅读268次。本文转载于:猿2048网站https://www.mk2048.com/blog/blog.php?id=hhaiib&title=%E5%89%8D%E7%AB%AF%E5%AD%A6%E4%B9%A0%E4%B9%8B%E8%B7%AF%E4%B9%8BCSS+%EF%BC%88%..._file:///d:/%e5%89%8d%e7%ab%af%e5%ad%a6%e4%b9%a0%e6%ba%90%e7%a0%81/%e6%b1