「补课」进行时:设计模式(4)——建造者模式
极客挖掘机
共 1641字,需浏览 4分钟
· 2020-10-29
1. 前文汇总
2. 建造者模式定义
建造者模式(Builder Pattern)也叫做生成器模式,其定义如下:
Separate the construction of a complex object from its representation sothat the same construction process can create different representations.(将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。)
通用类图:
Product: 产品类,通常是实现了模板方法模式,也就是有模板方法和基本方法。 Builder: 抽象建造者,规范产品的组建,一般是由子类实现。 ConcreteBuilder: 具体建造者,实现抽象类定义的所有方法,并且返回一个组建好的对象。 Director: 导演类,负责安排已有模块的顺序,然后告诉 Builder 开始建造。
通用代码示例:
Product 产品类:
public class Product {
public void doSomething() {
// 业务处理
}
}
Builder 抽象建造者:
public abstract class Builder {
// 设置产品不同的部分,用来获得不同的产品
abstract void setPart();
// 建造产品
abstract Product buildProduct();
}
ConcreteBuilder 具体建造者:
public class ConcreteProduct extends Builder{
private Product product = new Product();
@Override
void setPart() {
// 独特的处理逻辑
}
@Override
Product buildProduct() {
return product;
}
}
Director 导演类:
public class Director {
private Builder builder = new ConcreteProduct();
public Product getProduct() {
builder.setPart();
// 设置不同的 part ,生产不同的零件
return builder.buildProduct();
}
}
3. 通过建造者模式造一辆共享单车
接下来使用建造者模式造一辆共享单车。
经历过共享单车大战之后,现在共享单车还在运营活着的也没几家了,在大街上比较常看到的有美团单车和哈罗单车,先创建一个抽象的产品类:
public abstract class AbstractBike {
// 各个零件制造顺序
private ArrayList sequence = new ArrayList<> ();
// 自行车车架
protected abstract void frame();
// 自行车座位
protected abstract void seat();
// 自行车轮子
protected abstract void tire();
// 生产方法
final public void createBike() {
for (int i = 0; i < sequence.size(); i++) {
String actionName = this.sequence.get(i);
if (actionName.equalsIgnoreCase("frame")) {
this.frame();
} else if (actionName.equalsIgnoreCase("seat")) {
this.seat();
} else if (actionName.equalsIgnoreCase("tire")) {
this.tire();
}
}
}
final public void setSequence(ArrayList sequence) {
this.sequence = sequence;
}
}
在这个产品类中,定义了三个零件和一个零件的制造顺序,在单车的生产方法中,通过循环制造顺序,可以制造的顺序进行控制。
接下来是两个具体的产品类:
public class HelloBike extends AbstractBike {
@Override
protected void frame() {
System.out.println("现在开始生产一个哈罗车架");
}
@Override
protected void seat() {
System.out.println("现在开始生产一个哈罗座位");
}
@Override
protected void tire() {
System.out.println("现在开始生产两个哈罗轮胎");
}
}
public class MeituanBike extends AbstractBike {
@Override
protected void frame() {
System.out.println("现在开始生产一个美团车架");
}
@Override
protected void seat() {
System.out.println("现在开始生产一个美团座位");
}
@Override
protected void tire() {
System.out.println("现在开始生产两个美团轮胎");
}
}
接下来创建一个抽象的 Builder :
public abstract class Builder {
// 创建一个生产顺序模型
public abstract void setSequence(ArrayList sequence) ;
// 生产完成后获取这个车辆模型
public abstract AbstractBike getBike();
}
然后是两个具体的建造者:
public class HelloBuilder extends Builder {
private HelloBike helloBike = new HelloBike();
@Override
public void setSequence(ArrayList sequence) {
this.helloBike.setSequence(sequence);
}
@Override
public AbstractBike getBike() {
return this.helloBike;
}
}
public class MeituanBuilder extends Builder {
private MeituanBike meituanBike = new MeituanBike();
@Override
public void setSequence(ArrayList sequence) {
this.meituanBike.setSequence(sequence);
}
@Override
public AbstractBike getBike() {
return this.meituanBike;
}
}
最后是一个导演类:
public class Director {
private ArrayList sequence = new ArrayList<>();
private HelloBuilder helloBuilder = new HelloBuilder();
private MeituanBuilder meituanBuilder = new MeituanBuilder();
public HelloBike getHelloBike() {
this.sequence.clear();
// 自定义生产的顺序
this.sequence.add("frame");
this.sequence.add("seat");
this.sequence.add("tire");
this.helloBuilder.setSequence(sequence);
return (HelloBike) this.helloBuilder.getBike();
}
public MeituanBike getMeituanBike() {
this.sequence.clear();
// 定义生产的顺序
this.sequence.add("seat");
this.sequence.add("tire");
this.sequence.add("frame");
this.meituanBuilder.setSequence(sequence);
return (MeituanBike) this.meituanBuilder.getBike();
}
}
然后写一个 Test 类进行一下测试:
public class Test {
public static void main(String[] args) {
Director director = new Director();
director.getHelloBike().createBike();
}
}
运行结果是:
现在开始生产一个哈罗车架
现在开始生产一个哈罗座位
现在开始生产两个哈罗轮胎
最后放一个这个示例的 UML 类图:
评论
微服务与领域驱动设计,架构实践总结
来源:知了一笑👉 欢迎加入小哈的星球 ,你将获得: 专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书福利全栈前后端分离博客项目 2.0 版本完结啦, 演示链接:http://116.62.199.48/ ,新
小哈学Java
0
面试官:电商库存扣减如何设计?如何防止超卖?
来源:my.oschina.net/xiaolyuh/blog/1615639👉 欢迎加入小哈的星球 ,你将获得: 专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书福利全栈前后端分离博客项目 2.0 版本完结啦, 演示
小哈学Java
0
即将登陆,Win11的新功能:手机当摄像头、省电模式升级
近日,微软为其Windows 11操作系统推出了一次相对较小的功能更新“Moment 5”,但更多的激动人心的变化将在2024年下半年随着24H2版本的发布而揭晓。尽管完整的更新列表尚未公布,但一系列即将加入的新功能已经引起了广泛关注。引人注目的功能之一是,Windows 11将支持将手机作为无线网
Python 知识大全
3
公司新来一个同事,把风控系统设计得炉火纯青,万能通用,稳的一批!
点击关注公众号,Java 干货及时推送↓推荐阅读:铜三铁四,怒拿 35K * 14 薪!作者:wingli链接:https://juejin.cn/post/7182774381448282172一、背景1.为什么要做风控? 这不得拜产品大佬所赐目前我们业务有使用到非常多的AI能力,如oc
Java技术栈
0
有了这 4 款脚本工具, 再也不怕写烂 SQL了!!!
来自:toutiao.com/a6691523026984370699mysqltuner.pltuning-primer.shpt-variable-advisorpt-qurey-digest对于正在运行的mysql,性能如何,参数设置的是否合理,账号设置的是否存在安全隐患,你是否了然于胸呢?俗
良许Linux
0
推荐 4 个 yyds 的 AI 开源项目!
01AI 生成高清短视频这个 GitHub 仓库名为“MoneyPrinterTurbo”,由用户 harry0703 创建,开源两周已经获得了 6k+ 的 Star。该项目的核心功能是利用人工智能大型语言模型(AI LLM)技术,实现一键生成高清短视频。你只需提供一个视频主题或关键词 ,
良许Linux
0
【Nucleic Acids Research】利用生成式深度学习模型设计蓝藻细菌的合成启动子
题目:Design of synthetic promoters for cyanobacteria with generative deep-learning model期刊:Nucleic Acids Research影响因子:19.16发表时间:2023.5.29原文作者:Euijin Seo
生信宝典
0
为人类造福,而不是作恶—负责任的 AI x 蛋白质设计丨再创
引言 /Introduction蛋白质设计领域知名学者 David Baker 和来自 20 个国家的 90 多位顶尖科学家共同签署了一份包含十个可执行承诺的保证书。该承诺旨在最大化人工智能在蛋白质设计领域的益处,同时最小化潜在风险。该社区声明源自 2023 年 10 月 25 日华盛顿大学蛋白质设
生信宝典
0