「聊设计模式」之建造者模式(Builder)
🏆本文收录于《聊设计模式》专栏,专门攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎持续关注&&收藏&&订阅!
大家下午好,我是bug菌,今天我们继续聊设计模式。
前言
设计模式是众多优秀软件开发实践的总结和提炼,是软件工程中不可或缺的重要内容。其中建造者模式是一种非常常用的设计模式,本文将介绍建造者模式的概念、结构、应用场景、代码实现以及测试用例。
摘要
建造者模式是一种对象创建型设计模式。它将复杂对象的构建过程分离出来,使得同样的构建过程可以创建不同的表示。通过该模式,可以将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。通过该模式,可以减少构建过程中的重复代码,提高代码的重用性和可维护性。
建造者模式
概念
建造者模式是一种对象创建型设计模式,它将复杂对象的构建过程分离出来,使得同样的构建过程可以创建不同的表示。该模式将构建对象的过程分为若干个部分,分别进行构建,最终通过一个指挥者将这些部分组装成一个完整的对象。该模式可以解决复杂对象的创建和表示问题,同时可以提高代码的重用性和可维护性。
结构
建造者模式包含如下几个角色:
Product
(产品):表示要创建的复杂对象。Builder
(抽象建造者):定义创建产品各个部分的抽象接口。ConcreteBuilder
(具体建造者):实现抽象建造者接口,完成产品的各个部分的构建。Director
(指挥者):负责构建产品的对象,指挥具体建造者进行产品的构建。
如下是建造者模式的UML类图:
应用场景
建造者模式适用于以下场景:
- 创建对象的算法应该独立于组成部分以及它们的装配方式时。
- 同一个构建过程有不同的表示时。
- 需要创建一些复杂的对象,但是它们的部分构造过程必须有一定的顺序时。
- 需要在对象创建过程中进行更加精细的控制时。
模式优缺点
优点
- 将对象的构建与表示分离,使得同样的构建过程可以创建不同的表示,增加了程序的灵活性;
- 将复杂对象的构造代码与表示代码分开,易于维护;
- 隐藏了对象构建的细节,使得构建代码与表示代码分离,提高了代码的可读性和可维护性;
- 可以对不同的具体建造者进行更换和扩展。
缺点
- 由于需要定义抽象建造者和具体建造者类,因此建造者模式增加了系统的类的个数,导致系统更加庞大。
建造者模式实现
以下是建造者模式的代码实现,以Java语言为例:
产品(Product)
package com.example.javaDesignPattern.builder;
/**
* 产品
*
* @Author bug菌
* @Date 2023-09-19 0:00
*/
public class Product {
private String partA;
private String partB;
private String partC;
public String getPartA() {
return partA;
}
public void setPartA(String partA) {
this.partA = partA;
}
public String getPartB() {
return partB;
}
public void setPartB(String partB) {
this.partB = partB;
}
public String getPartC() {
return partC;
}
public void setPartC(String partC) {
this.partC = partC;
}
public String toString() {
return "PartA: " + partA + ", PartB: " + partB + ", PartC: " + partC;
}
}
抽象建造者(Builder)
package com.example.javaDesignPattern.builder;
/**
* 抽象建造者(Builder)
*
* @Author bug菌
* @Date 2023-09-19 0:03
*/
public interface Builder {
void buildPartA();
void buildPartB();
void buildPartC();
Product getResult();
}
具体建造者(ConcreteBuilder )
package com.example.javaDesignPattern.builder;
/**
* 具体建造者(ConcreteBuilder )
*
* @Author bug菌
* @Date 2023-09-19 0:03
*/
public class ConcreteBuilder implements Builder {
private Product product = new Product();
public void buildPartA() {
product.setPartA("A");
}
public void buildPartB() {
product.setPartB("B");
}
public void buildPartC() {
product.setPartC("C");
}
public Product getResult() {
return product;
}
}
指挥者(Director)
package com.example.javaDesignPattern.builder;
/**
* 指挥者(Director)
*
* @Author bug菌
* @Date 2023-09-19 0:03
*/
public class Director {
public void construct(Builder builder) {
builder.buildPartA();
builder.buildPartB();
builder.buildPartC();
}
}
代码方法介绍
Product
类:表示要创建的复杂对象。该类包含了对象的各个部分,并提供了设置和获取各个部分的方法。Builder
接口:定义创建产品各个部分的抽象接口。包含了创建每个部分的抽象方法以及获取最终产品的方法。ConcreteBuilder
类:实现Builder
接口,完成产品的各个部分的构建。Director
类:负责构建产品的对象,指挥具体建造者进行产品的构建。该类包含了构建产品的算法。
测试用例
以下是建造者模式的测试用例:
package com.example.javaDesignPattern.builder;
/**
* @Author bug菌
* @Date 2023-09-19 0:05
*/
public class BuilderPattern {
public static void main(String[] args) {
Director director = new Director();
Builder builder = new ConcreteBuilder();
director.construct(builder);
Product product = builder.getResult();
System.out.println(product.getPartA());
System.out.println(product.getPartB());
System.out.println(product.getPartC());
System.out.println(product.toString());
}
}
测试结果如下:
测试用例代码解读:
这是一个实现Builder设计模式的示例代码。Builder模式的目的是将对象的构建过程与表示分离,从而使同样的构建过程可以创建出不同的表示形式。下面是代码的解读:
- 首先定义了一个
Builder
接口,ConcreteBuilder
类实现了 Builder 接口。 Product
类是最终要构建的对象。Director
类是建造者模式中的指挥者,用于构造Product
对象。- 在
main
方法中,先创建了一个ConcreteBuilder
对象,在调用Director
的construct
方法时传入该builder
。Director
会调用ConcreteBuilder
的具体方法来构造 Product。 - 最后通过
getResult
方法获取Product
对象,并输出其三个部分的值,以及使用toString
方法输出Product
对象的所有属性。
这个建造者模式的示例比较简单,但是建造者模式常用于构建较为复杂的对象,例如生成 HTML 页面、构建复杂的数据库查询等。通过建造者模式可以降低对象构建的复杂度,使代码更易于维护。
小结
本文介绍了建造者模式的概念、结构、应用场景和代码实现。在建造者模式中,将复杂对象的构建过程分离出来,使得同样的构建过程可以创建不同的表示。通过该模式,可以减少构建过程中的重复代码,提高代码的重用性和可维护性。建造者模式适用于复杂对象的创建和表示问题,以及需要更加精细的控制的场景。在代码实现中,需要定义产品类、抽象建造者接口、具体建造者类和指挥者类,分别完成产品的各个部分的构建和产品的组装。最后,通过测试用例验证建造者模式的正确性。
附录源码
如上涉及代码均已上传同步在GitHub,提供给同学们参考性学习。
总结
建造者模式是一种非常常用的设计模式,它将复杂对象的构建过程分离出来,使得同样的构建过程可以创建不同的表示。通过该模式,可以减少构建过程中的重复代码,提高代码的重用性和可维护性。该模式适用于复杂对象的创建和表示问题,以及需要更加精细的控制的场景。在实际开发中,建议合理运用建造者模式,提高代码的质量和可维护性。
☀️建议/推荐你
如果想系统性的全面学习设计模式,建议小伙伴们直接毫无顾忌的关注这个专栏《聊设计模式》,无论你是想提升自己的编程技术,还是渴望更好地理解代码背后的设计思想,本专栏都会为你提供实用的知识和启发,帮助你更好地解决日常开发中的挑战,将代码变得更加优雅、灵活和可维护!
最后,如果这篇文章对你有所帮助,帮忙给作者来个一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。
同时欢迎大家关注公众号:「猿圈奇妙屋」 ,以便学习更多同类型的技术文章,免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板、技术文章Markdown文档等海量资料。
📣关于我
我是bug菌,CSDN | 掘金 | infoQ | 51CTO 等社区博客专家,历届博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,华为云 | 阿里云| 腾讯云等社区优质创作者,全网粉丝合计15w+ ;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等海量资料。
- 点赞
- 收藏
- 关注作者
评论(0)