🏆本文收录于《聊设计模式》专栏,专门攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎持续关注&&收藏&&订阅!
前言
设计模式是众多优秀软件开发实践的总结和提炼,是软件工程中不可或缺的重要内容。其中建造者模式是一种非常常用的设计模式,本文将介绍建造者模式的概念、结构、应用场景、代码实现以及测试用例。
摘要
建造者模式是一种对象创建型设计模式。它将复杂对象的构建过程分离出来,使得同样的构建过程可以创建不同的表示。通过该模式,可以将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。通过该模式,可以减少构建过程中的重复代码,提高代码的重用性和可维护性。
建造者模式
何为建造者模式?
建造者模式是一种对象创建型设计模式,它将复杂对象的构建过程分离出来,使得同样的构建过程可以创建不同的表示。该模式将构建对象的过程分为若干个部分,分别进行构建,最终通过一个指挥者将这些部分组装成一个完整的对象。该模式可以解决复杂对象的创建和表示问题,同时可以提高代码的重用性和可维护性。
结构
建造者模式包含如下几个角色:
Product
(产品):表示要创建的复杂对象。Builder
(抽象建造者):定义创建产品各个部分的抽象接口。ConcreteBuilder
(具体建造者):实现抽象建造者接口,完成产品的各个部分的构建。Director
(指挥者):负责构建产品的对象,指挥具体建造者进行产品的构建。
建造者模式的结构图如下所示:
应用场景
建造者模式适用于以下场景:
- 创建对象的算法应该独立于组成部分以及它们的装配方式时。
- 同一个构建过程有不同的表示时。
- 需要创建一些复杂的对象,但是它们的部分构造过程必须有一定的顺序时。
- 需要在对象创建过程中进行更加精细的控制时。
建造者模式的优缺点
优点
- 将对象的构建与表示分离,使得同样的构建过程可以创建不同的表示,增加了程序的灵活性;
- 将复杂对象的构造代码与表示代码分开,易于维护;
- 隐藏了对象构建的细节,使得构建代码与表示代码分离,提高了代码的可读性和可维护性;
- 可以对不同的具体建造者进行更换和扩展。
缺点
- 由于需要定义抽象建造者和具体建造者类,因此建造者模式增加了系统的类的个数,导致系统更加庞大。
建造者模式的示例
以下是建造者模式的代码实现,以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,提供给同学们参考性学习。
总结
建造者模式是一种非常常用的设计模式,它将复杂对象的构建过程分离出来,使得同样的构建过程可以创建不同的表示。通过该模式,可以减少构建过程中的重复代码,提高代码的重用性和可维护性。该模式适用于复杂对象的创建和表示问题,以及需要更加精细的控制的场景。在实际开发中,建议合理运用建造者模式,提高代码的质量和可维护性。
☀️建议/推荐你
如果想系统性的全面学习设计模式,建议小伙伴们直接毫无顾忌的关注这个专栏《聊设计模式》,无论你是想提升自己的编程技术,还是渴望更好地理解代码背后的设计思想,本专栏都会为你提供实用的知识和启发,帮助你更好地解决日常开发中的挑战,将代码变得更加优雅、灵活和可维护!
📣关于我
我是bug菌,CSDN | 掘金 | infoQ | 51CTO 等社区博客专家,历届博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,华为云 | 阿里云| 腾讯云等社区优质创作者,全网粉丝合计15w+ ;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等海量资料。