论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
IT评测·应用市场-qidao123.com
»
论坛
›
数据库
›
分布式数据库
›
设计模式之建造者模式
设计模式之建造者模式
曹旭辉
金牌会员
|
2024-9-21 00:01:55
|
显示全部楼层
|
阅读模式
楼主
主题
967
|
帖子
967
|
积分
2901
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
建造者模式(Builder Pattern)是一种对象创建型设计模式,它旨在找到一种灵活构建复杂对象的方式。
一、概述
在建造者模式中,一个复杂对象的表示与它的构造过程分离,使得同样的构建过程可以创建差别的表示。建造者模式通常包含以下几个角色:
1、产品(Product)角色
它是被构建的复杂对象,包含多个构成部件的类(如汽车的轮胎、发动机等)。
2、抽象建造者(Builder)角色
定义一个接口,用于规范产品对象的各个构成部门的建造。一般而言,这个接口中定义了产品的创建方法和返回方法。
3、具体建造者(ConcreteBuilder)角色
实现Builder接口,完成复杂产品的具体创建。在构建过程完成后,提供产品的实例。
4、指挥者(Director)角色
负责安排复杂对象的建造序次,指挥者与抽象建造者之间存在关联关系,可以在其construct()建造方法中调用建造者对象的部件构造和装配方法,完成复杂对象的创建。客户端一般只必要与指挥者举行交互,以建造出复杂的产品对象。
二、建造者模式的长处
1、封装性好:
使用建造者模式可以使客户端不必知道产品内部构成的细节。
2、扩展性好:
建造者模式易于扩展,增加新的具体建造者无须修改原有类库的代码,易于遵守开闭原则。
3、便于控制细节:
如果产品类非常复杂,大概产品类中的调用顺序差别会产生差别的作用,那么使用建造者模式就非常合适,因为具体的建造者类可以对这些细节举行很好的封装。
三、建造者模式的缺点
1、产生多余的Builder对象:
由于建造者模式中的具体建造者通常是独立的,因此其创建的过程中不可避免会产生一些只包含临时数据的对象,如果建造者模式使用不当,会造成资源的浪费。
2、设计难度增加:
建造者模式的参加会使系统中类的个数增加,在一定水平上增加了系统的理解与设计难度。
四、Java代码示例
以下是一个使用建造者模式构建汽车的示例。在这个例子中,我们有一个Car类作为产品,一个CarBuilder接口作为抽象建造者,几个具体的CarBuilder实现类(如SedanBuilder、SUVBuilder等),以及一个CarDirector类作为指挥者。
1. 定义产品类(Car)
public class Car {
private String engine;
private String body;
private String wheels;
// 省略构造方法
// Getter 和 Setter
public String getEngine() {
return engine;
}
public void setEngine(String engine) {
this.engine = engine;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public String getWheels() {
return wheels;
}
public void setWheels(String wheels) {
this.wheels = wheels;
}
// 显示汽车信息
public void display() {
System.out.println("Engine: " + engine);
System.out.println("Body: " + body);
System.out.println("Wheels: " + wheels);
}
}
复制代码
2. 定义抽象建造者(CarBuilder)
public interface CarBuilder {
void buildEngine();
void buildBody();
void buildWheels();
// 返回最终构建的汽车产品
Car getCar();
}
复制代码
3. 定义具体建造者(SedanBuilder 和 SUVBuilder)
public class SedanBuilder implements CarBuilder {
private Car car = new Car();
@Override
public void buildEngine() {
car.setEngine("V6 Engine");
}
@Override
public void buildBody() {
car.setBody("Sedan Body");
}
@Override
public void buildWheels() {
car.setWheels("4 Wheels");
}
@Override
public Car getCar() {
return car;
}
}
public class SUVBuilder implements CarBuilder {
private Car car = new Car();
@Override
public void buildEngine() {
car.setEngine("V8 Engine");
}
@Override
public void buildBody() {
car.setBody("SUV Body");
}
@Override
public void buildWheels() {
car.setWheels("4 Wheels with All-Wheel Drive");
}
@Override
public Car getCar() {
return car;
}
}
复制代码
4. 定义指挥者(CarDirector)
public class CarDirector {
private CarBuilder builder;
public CarDirector(CarBuilder builder) {
this.builder = builder;
}
// 构造顺序
public Car constructCar() {
builder.buildEngine();
builder.buildBody();
builder.buildWheels();
return builder.getCar();
}
}
复制代码
5. 客户端代码
public class Client {
public static void main(String[] args) {
// 使用 SedanBuilder
CarBuilder sedanBuilder = new SedanBuilder();
CarDirector director = new CarDirector(sedanBuilder);
Car sedan = director.constructCar();
sedan.display();
// 使用 SUVBuilder
CarBuilder suvBuilder = new SUVBuilder();
director = new CarDirector(suvBuilder);
Car suv = director.constructCar();
suv.display();
}
}
复制代码
6、深入解析
在上面的例子中,Car类是一个复杂的产品,包含发动机、车身和轮子等部门。CarBuilder接口定义了如何构建这些部门,而SedanBuilder和SUVBuilder是具体的建造者,分别实现了差别的构建逻辑。CarDirector类则负责按照特定的顺序调用建造者的方法,以构建出完整的汽车对象。
客户端代码通过创建差别的建造者实例,并将其传递给指挥者,来构建差别范例的汽车。这种方式使得客户端与产品的具体构建过程解耦,客户端只必要知道指挥者和建造者的接口,而不必要知道具体的实现细节。
7、建造者模式的变体
在现实应用中,建造者模式偶尔会有一些变体。例如,有些环境下可能不必要指挥者角色,而是直接在客户端代码中调用建造者的方法来构建产品。此外,还可以将建造者模式与其他设计模式结合使用,如工厂模式、单例模式等,以实现更复杂的系统设计。
五、总结
建造者模式是一种强大的设计模式,它允许我们通过组合差别的组件来构建复杂对象,同时保持构建过程的灵活性和可扩展性。通过定义抽象建造者接口和具体建造者实现类,我们可以将产品的构建过程与产品的表示分离,从而实现更好的封装和复用。此外,建造者模式还提供了很好的扩展性,使得我们可以在不修改原有代码的环境下添加新的具体建造者类来构建新的产品。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
曹旭辉
金牌会员
这个人很懒什么都没写!
楼主热帖
网络安全应急响应 - 03 - 日志分析与内 ...
Redis - 介绍与使用场景
Nmap抓包分析与绕过Windows防火墙 ...
Mysql 的Innodb引擎和Myisam数据结构和 ...
一招教你如何高效批量导入与更新数据 ...
【docker系列】docker API管理接口增加 ...
聊聊Spring事务控制策略以及@Transacti ...
用代码收集每天热点内容信息,并发送到 ...
微服务架构演进
Maven配置私有仓库
标签云
AI
运维
CIO
存储
服务器
浏览过的版块
linux
Oracle
网络安全
虚拟化与私有云
快速回复
返回顶部
返回列表