Java设计模式之创建型-建造者模式(UML类图+案例分析)

news/2025/2/7 6:54:57/

目录

一、基本概念

二、UML类图

三、角色设计 

四、案例分析

五、总结


一、基本概念

建造者模式是一种创建型设计模式,它使我们将一个复杂对象的构建步骤分离出来,使得同样的构建过程可以创建不同的表示。该模式的目的是将构建复杂对象的过程抽象化,从而减少代码的重复和复杂度。

在建造者模式中,我们通过Builder接口或抽象类定义了一个标准的构建流程,然后让不同的具体构造者按照这个标准来实现自己的构建流程。同时,我们还定义了一个指导者(Director)类,用于按照特定的顺序执行构建流程,从而完成对象的构建。

二、UML类图

三、角色设计 

角色描述
Phone一个具体的手机对象
Builder创建一个手机各个部件的抽象类/接口
PhoneBuilder具体的手机建造者,构件和装配手机的各个配件
Director构件一个使用Builder的对象,它主要是用于创建一个复杂的对象,它主要有2个作用,一方面是隔离了客户和手机生产的过程,另一方面是负责控制手机的生产过程

四、案例分析

例如有如下一个场景:日常生活中手机也分为有基础入门、中端和高端旗舰机三个档次的手机,客户这时候提出了一个需求:我想购买一部基础入门机和一部高端旗舰机!客户是完全不需要知晓整部手机的生产过程,只需要传达给指挥者,指挥者通过对应的手机建造者去控制生产对应的手机即可,下面我们通过代码实现这个案例:

手机类:

包含了基础的核心处理器、内存和电池3个参数。

public class Phone {private String cpu;private String memory;public String getCpu() {return cpu;}public void setCpu(String cpu) {this.cpu = cpu;}public String getMemory() {return memory;}public void setMemory(String memory) {this.memory = memory;}public String getBattery() {return battery;}public void setBattery(String battery) {this.battery = battery;}private String battery;
}

建造者抽象类:

提供了一个基础的手机对象,建造核心处理器,内存和电池三个抽象方法,返回建造完毕的手机对象。

public abstract class Builder {protected Phone phone = new Phone();public abstract void buildCpu();public abstract void buildMemory();public abstract void buildBattery();public Phone builder(){return this.phone;}
}

一个基础手机实现抽象建造者类:

public class BasicPhoneBuilder extends Builder{@Overridepublic void buildCpu() {System.out.println("麒麟980");phone.setCpu("麒麟980");}@Overridepublic void buildMemory() {System.out.println("8G内存");phone.setMemory("8G内存");}@Overridepublic void buildBattery() {System.out.println("22.5W快充");phone.setBattery("22.5W快充");}
}

一个高端手机实现建造者抽象类:

public class AdvancedPhoneBuilder extends Builder{@Overridepublic void buildCpu() {System.out.println("麒麟9000");phone.setCpu("麒麟9000");}@Overridepublic void buildMemory() {System.out.println("12G内存");phone.setMemory("12G内存");}@Overridepublic void buildBattery() {System.out.println("66W快充");phone.setBattery("66W快充");}
}

创建一个指挥者,用于建造出不同类型手机:

public class Director {private Builder builder;public Director(Builder builder){this.builder = builder;}public Phone builder(){builder.buildCpu();builder.buildMemory();builder.buildBattery();return builder.builder();}
}

客户端:

public class Client {public static void main(String[] args) {Builder basicPhoneBuilder = new BasicPhoneBuilder();Phone basicPhone = new Director(basicPhoneBuilder).builder();Builder advancedPhoneBuilder = new AdvancedPhoneBuilder();Phone advancedPhone = new Director(advancedPhoneBuilder).builder();}
}

运行结果:

五、总结

优点:

1、将构建复杂对象的过程封装起来,简化了代码结构和逻辑,客户端不需要知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的过程可以创建出不同的产品对象。

2、每一个建造者都相对独立,和其他建造者没有关系,因此可以很方便的替换具体的建造者或者添加新的具体建造者,客户端使用不同的建造者可以获得不同的产品对象,系统扩展方便,符合“开闭原则”。

缺点:

1、添加新的部件需要修改抽象类和具体构造者的代码。

2、建造者模式所创建的产品都有很多的共同之处,组成部分相似,如果产品之间的差异性很大,则组成部分不同,不适合使用建造者模式,因此范围很局限。

应用场景:

1、相同的方法,不同的执行顺序,产生不同的事件结果时。

2、多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时。

3、产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能。

4、初始化一个对象消耗的资源非常大,则可以通过建造者模式分步初始化。

建造者模式将复杂对象的构建与表示分离,使得相同的构建过程可以创建不同表示。它是一步一步创建一个复杂对象的最佳模式。


http://www.ppmy.cn/news/822711.html

相关文章

光猫可以直接接交换机吗 交换机能直接连光猫吗

交换机能直接连光猫吗、先连光猫好还是交换机,先接哪个,根据你的需要接。先后次序改变,功能与性能略有区别。一般是先接路由器,端口不够,再接交换机或集线器。   如果通了几路IPTV,则要先接交换机&#x…

光猫 路由器 和交换器

一.光猫(调制解调器) 作用:把外界传入的光信号转化为网线传输的电信号 用法:有两个接口,一个接口插入光纤等设备,另一个接口连接网线出来,插入电脑,拨号即可上网,也可插…

onu光功率多少是正常_光猫的收发光功率正常范围是多少

我们现在用的宽带都是通过光纤连接,其实光纤只是我们能够直接看见的一种传输介质,真正起作用的是最里面一层的玻璃纤维,光在玻璃纤维里面不断地发射折射现象就有了我们的光信号,光信号的强弱我们叫做光功率通常也称为光衰。 光功率的大小会直接影响到我们的网络体验,光功率…

从光猫的发出到另一个光猫的接入

4.1 ADSL 接入网的结构和工作方式 互联网也是通过路由器进行转发包的,不同的地方在于转发的距离以及如何控制转发目标,因为路由表记录的维护方式不同。 互联网发包的规则与接入网有关,接入网就是公司家庭等连接互联网的通信线路包括 ADSL、F…

光猫、路由器、交换机如何工作的

路由器 功能概述 简单的来说就是负责拨号连接互联网收发报文数据,将计算机发送的数据通过路由信息(路由表)转发出去到目的地址,然后目标地址设备返回信息数据包到路由器,再由路由器转发给该计算机。 路由信息&#xf…

通过配置光猫路由器实现家用主机远程桌面连接

我们都知道,windows的远程桌面连接需要连接到外网IP地址,在windows下通过命令行ipconfig打印出来IP,而这个IP地址其实是局域网IP,如下图1。想获得自己外网IP,可以通过百度搜索“IP地址查询”得到,如下图2。…

通俗理解光猫、网关、路由器、交换机

参考博客 计算机网络中间设备(网关,路由器,交换机,网桥,中继器,集线器)它们都可以理解为发送或接收数据的终端设备。 本质区分(工作网络层口不同) 传输层(网关) 网络层(路由器) 数据链路层(网桥&#xf…

中国电信光猫路由模式端口映射问题记录

我使用的是中国电信,在获取了动态公网IP后开始了端口映射工作。这里记录一个问题,即端口映射之后,使用本光猫路由器的网络来连接其公网地址无法连接,使用非本地网络,如手机的流量访问则有效。这里引用一下其他人的回复…