03-JAVA设计模式-建造者模式

建造者模式

什么是建造者模式

建造者模式(Builder Pattern)是一种对象构建的设计模式,它允许你通过一步一步地构建一个复杂对象,来隐藏复杂对象的创建细节。
这种模式将一个复杂对象的构建过程与其表示过程分离,使得同样的构建过程可以创建不同的表示。命名建议以Builder结尾,以达到见名之意。

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

  • 产品(Product):这是最终要创建的对象,它通常包含多个属性,并且可能具有复杂的内部结构。
  • 抽象建造者(Builder):这是一个接口或者抽象类,定义了创建产品所需的方法。这些方法通常是一系列设置产品属性的步骤。
  • 具体建造者(ConcreteBuilder):这个类实现了抽象建造者接口,提供了构建产品的具体实现。它包含了创建产品对象的所有逻辑,并可以一步步地设置产品对象的属性。
  • 导演者(Director):这是一个可选的角色,它负责调用建造者接口中的方法来构建产品对象。导演者可以简化客户端代码,使得客户端无需关心具体的构建步骤。

使用场景

  • 当我们要建造一个复杂的产品。比如:手机时。这种复杂产品的创建,需要处理子组件装配的问题。
  • 实际开发中,我们所需要的对象构建时也非常复杂,有很多步骤需要处理时。

建造者模式的本质

  • 分离了对象子组件的单独构造(有Buider来负责)和装配(有Director负责)。从而可以构造负责的对象。
  • 这个模式适用于在某个对象构建过程复杂的情况下使用。
  • 由于实现了构建和装配的解耦。不同的构建器,相同的装配,可以做出不同的对象; 相同的构建器,不同的装配顺序也可以做出不同的对象。也就是实现了构建算法、装配算法的解耦,实现了更好的复用。

案例

实现建造华为手机与小米手机

通过静态内部类作为建造者

Phone.java

public class Phone {// 机身private String fuselage;// 摄像头private String camera;// 系统内核private String systemKernel;// 私有构造方法,只能通过建造者创建private Phone(Builder builder) {this.fuselage = builder.fuselage;this.camera = builder.camera;this.systemKernel = builder.systemKernel;}@Overridepublic String toString() {return "Phone{" +"fuselage='" + fuselage + '\'' +", camera='" + camera + '\'' +", systemKernel='" + systemKernel + '\'' +'}';}// 静态内部类作为建造者static class Builder {// 机身private String fuselage;// 摄像头private String camera;// 系统内核private String systemKernel;public Builder setFuselage(String fuselage) {this.fuselage = fuselage;return this;    // 链式调用}public Builder setCamera(String camera) {this.camera = camera;return this;    // 链式调用}public Builder setSystemKernel(String systemKernel) {this.systemKernel = systemKernel;return this;    // 链式调用}// 创建手机public Phone createPhone(){return new Phone(this);}}
}

Client.java

public class Client {public static void main(String[] args) {Phone phone = new Phone.Builder().setCamera("华为摄像头").setFuselage("华为机身").setSystemKernel("鸿蒙系统").createPhone();System.out.println(phone);Phone phone2 = new Phone.Builder().setCamera("小米摄像头").setFuselage("小米机身").setSystemKernel("小米系统").createPhone();System.out.println(phone2);}
}

执行结果:

在这里插入图片描述

通过接口实现建造者模式

UML

在这里插入图片描述

不使用导演者

Phone.java

public class Phone {// 机身private String fuselage;// 摄像头private String camera;// 系统内核private String systemKernel;public void setFuselage(String fuselage) {this.fuselage = fuselage;}public void setCamera(String camera) {this.camera = camera;}public void setSystemKernel(String systemKernel) {this.systemKernel = systemKernel;}@Overridepublic String toString() {return "Phone{" +"fuselage=" + fuselage +", camera=" + camera +", systemKernel=" + systemKernel +'}';}
}

IPhoneBuider.java

// 手机 抽象建造者定义接口
public interface IPhoneBuider {// 设置机身IPhoneBuider setFuselage(String fuselage);// 设置摄像头IPhoneBuider setCamera(String camera);// 设置系统内核IPhoneBuider setSystemKernel(String systemKernel);// 返回创建对象Phone buildPhone();
}

PhoneBuilder.java

// 建造者具体实现
public class PhoneBuilder implements IPhoneBuider {// 定义建造者返回对象private Phone phone;public PhoneBuilder() {// 初始化Phonethis.phone = new Phone();}@Overridepublic IPhoneBuider setFuselage(String fuselage) {phone.setFuselage(fuselage);return this;}@Overridepublic IPhoneBuider setCamera(String camera) {phone.setCamera(camera);return this;}@Overridepublic IPhoneBuider setSystemKernel(String systemKernel) {phone.setSystemKernel(systemKernel);return this;}@Overridepublic Phone buildPhone() {return phone;}
}

TestClient2.java

public class TestClient2 {public static void main(String[] args) {// 创建建造具体建造者PhoneBuilder phoneBuilder = new PhoneBuilder();Phone phone = phoneBuilder.setCamera("装配小米摄像头").setFuselage("装配小米机身").setSystemKernel("装配小米系统").buildPhone();System.out.println(phone.toString());}
}

在这里插入图片描述

使用导演者

新增导演者
HuaweiDirector.java

// 华为手机导演者
public class HuaweiDirector {// 定义建造者属性private IPhoneBuider phoneBuider;public HuaweiDirector(IPhoneBuider phoneBuider) {this.phoneBuider = phoneBuider;}public Phone createPhone(){Phone phone = phoneBuider.setCamera("装配华为摄像头").setFuselage("装配华为机身").setSystemKernel("装配鸿蒙系统").buildPhone();return phone;}
}

TestClient.java

public class TestClient {public static void main(String[] args) {// 创建建造具体建造者PhoneBuilder phoneBuilder = new PhoneBuilder();// 创建导演者 传入具体建造者HuaweiDirector huaweiDirector = new HuaweiDirector(phoneBuilder);// 通过导演者构建手机Phone phone = huaweiDirector.createPhone();System.out.println(phone.toString());}
}

在这里插入图片描述

gitee源码

git clone https://gitee.com/dchh/JavaStudyWorkSpaces.git

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/600133.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库(mysql)-基本查询语句(DQL)

查询语句 这边查询是给予一定表格,这边先做个解释 教师表包括(name(姓名),gender(性别),salary(工资),title(职位),subject_id(课程的编号),comm(奖金)) 学生表包括(姓名(name),gender(性别),job(职位),生日(birth)) 模版 SELECT 字段名 FROM 查询表 WHERE 查询语句 或与非…

前端开发之Element树结构组件el-input的type=“password“时候账号密码自动填充解决方案

Element树结构组件el-input的type“password“时候账号密码自动填充解决方案 前言效果图解决方案 前言 在使用element的input的password当参数和login的参数相同时,在浏览器保存的用户名密码会自动填充,导致input附加上默认值 使用场景一般是在用户管理…

Android 自定义通知样式(回复、点赞)

1、实现自定义通知样式,本文基于极光推送,核心处理逻辑,不区分具体推送平台 2、通知类型判断: 根据极光通知类型判断(自定义消息,极光本身是不支持通知展示回复、点赞等功能) if(JPushInterface.ACTION_MESSAGE_RECE…

Android 9.0 framework层实现app默认全屏显示

1.前言 在9.0的系统rom产品定制化开发中,在对于第三方app全屏显示的功能需求开发中,需要默认app全屏显示,针对这一个要求,就需要在系统启动app 的过程中,在绘制app阶段就设置全屏属性,接下来就实现这个功能 效果图如下: 2.framework层实现app默认全屏显示的核心类 fram…

Vue - 你知道Vue组件之间是如何进行数据传递的吗

难度级别:中级及以上 提问概率:85% 这道题还可以理解为Vue组件之间的数据是如何进行共享的,也可以理解为组件之间是如何通信的,很多人叫法不同,但都是说的同一个意思。我们知道,在Vue单页面应用项目中,所有的组件都是被嵌套在App.vue内…

nginx支持的多种负载均衡策略

目录 1.轮询(默认) 2. ip_hash 3. 加权轮询(weight) 4. fair(第三方) 5. 最少连接(least_conn) 1.轮询(默认) 将请求依次分配给每个服务器,确…

thinkphp6中使用监听事件和事件订阅

目录 一:场景介绍 二:事件监听 三:配置订阅 一:场景介绍 在项目开发中有很多这样的场景,比如用户注册完了,需要通知到第三方或者发送消息。用户下单了,需要提示给客服等等。这些场景都有一个…

冯喜运:4.2外汇黄金黄金行情趋势分析,黄金原油独家操作建议。

黄金技术面解析:      黄金目前受俄乌局势和美联储降息预期影响,出现了猛烈拉升上涨,已经成功企稳了2200大关,并且步步新高,不断的刷新历史高位,避险买盘强劲。现在日线连阳拉升再次打开布林上轨空间&a…

Linux——静态库 共享库

1.库文件 1).库文件 库是一组预先编译好的方法的集合; Linux系统存储库的位置一般在/lib 和 /usr/lib (64位系统/usr/lib64) 库的头文件放在/usr/include 2).库的分类 静态库:libxxx.a(命名规则) 共享库:libxxx.so(命名规则) 3).准备文件: //add.c int add(int x,int y) { re…

4.7Qt

自由发挥应用场景实现一个登录窗口界面。 mywidget.cpp #include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {//窗口相关设置this->setWindowTitle("原神启动");this->setWindowIcon(QIcon("C:\\Users\\17212\\Pict…

外包干了25天,技术倒退明显

先说情况,大专毕业,18年通过校招进入湖南某软件公司,干了接近6年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能…

【Java】maven是什么?

先看一下基本概念: ①Maven 翻译为"专家","内行"是跨平台的项目管理工具。 主要服务于基于Java平台的项目构建,依赖管理和项目信息管理。 ②项目构建 项目构建过程包括【清理项目】→【编译项目】→【测试项目】→【生成测试报…