• 设计模式- 建造者模式(Builder Pattern)结构|原理|优缺点|场景|示例


                                        设计模式(分类)        设计模式(六大原则)   

        创建型(5种)        工厂方法         抽象工厂模式        单例模式        建造者模式        原型模式

        结构型(7种)        适配器模式        装饰器模式        代理模式        ​​​​​​外观模式      桥接模式        组合模式       享元模式

        行为型(11种)       策略模式        模板方法模式         观察者模式        迭代器模式        责任链模式        命令模式

                                       备忘录模式          状态模式          访问者模式        中介者模式    


    建造者模式(Builder Pattern)是一种创建型设计模式,其主要目的是将复杂对象的构建过程与它的表示分离,使得相同的构建过程可以创建不同的表示。这种模式适用于创建包含多个可选部件、步骤复杂且可能需要逐步构建的复杂对象,它能将构建过程分解为多个独立的、可复用的步骤,使得对象的创建过程更加清晰、灵活且易于扩展。

    模式结构

    建造者模式通常包含以下角色:

    • 产品(Product):表示要构建的复杂对象,包含多个组成部件。
    • 抽象建造者(Abstract Builder):定义创建产品各个部件的接口,并声明一个方法返回最终的完整产品。
    • 具体建造者(Concrete Builders):实现抽象建造者的接口,提供创建产品各个部件的详细实现,并在最后返回一个完整的具体产品实例。
    • 导演者(Director):负责调用具体建造者的相关方法来一步步构建产品,它不涉及具体产品的部件创建细节,只负责按特定顺序安排建造过程。

    工作原理

    • 客户端:创建一个具体建造者实例,并将其交给导演者。客户端不直接与产品交互,而是通过导演者指定构建过程。
    • 导演者:持有具体建造者实例,调用其方法按照预定的步骤构建产品。导演者不关心具体建造者的内部实现细节,只关注构建过程的顺序。
    • 具体建造者:实现抽象建造者接口,提供构建产品各个部件的方法。每个具体建造者对应一种产品的不同构建方式。
    • 产品:定义产品的组成部分和接口,供外界使用。具体建造者通过构建产品的各个部件来创建完整的产品实例。

    优缺点

    优点
    • 封装性:将复杂对象的构建过程封装在建造者内部,与对象的表示分离,使客户端无需了解对象的内部构造细节。
    • 灵活性:可以通过改变具体建造者来改变产品的内部结构,无需修改导演者和客户端代码,符合“开闭原则”。
    • 可扩展性:易于扩展以构建不同类型的复杂对象,只需增加新的具体建造者即可。
    • 可复用性:抽象建造者和具体建造者可以被多个导演者重用,构建过程可以独立于使用过程。
    缺点
    • 代码复杂度增加:引入了多个类(抽象建造者、具体建造者、导演者),增加了系统的复杂性,对于简单的对象构建可能显得过度设计。
    • 产品结构固化:如果产品的内部结构需要频繁变动,可能需要不断修改建造者,维护成本较高。

    适用场景

    • 对象构建过程复杂:当对象的创建涉及多个步骤,且这些步骤的顺序和组合可能有多种变化时,适合使用建造者模式。
    • 需要灵活改变产品内部结构:当需要构建的产品内部结构可变,或者存在多种不同结构的产品需要构建时,建造者模式可以提供灵活的构建方式。
    • 构建过程独立于使用过程:当构建过程与产品的使用过程分离,且构建过程需要独立封装时,建造者模式能够很好地满足需求。

    代码示例(以Java为例)

    1. // 产品(复杂对象)
    2. class Computer {
    3. private String cpu;
    4. private String ram;
    5. private String hdd;
    6. public Computer(String cpu, String ram, String hdd) {
    7. this.cpu = cpu;
    8. this.ram = ram;
    9. this.hdd = hdd;
    10. }
    11. @Override
    12. public String toString() {
    13. return "Computer{" +
    14. "cpu='" + cpu + '\'' +
    15. ", ram='" + ram + '\'' +
    16. ", hdd='" + hdd + '\'' +
    17. '}';
    18. }
    19. }
    20. // 抽象建造者
    21. interface ComputerBuilder {
    22. void buildCPU(String cpu);
    23. void buildRAM(String ram);
    24. void buildHDD(String hdd);
    25. Computer build();
    26. }
    27. // 具体建造者
    28. class DesktopBuilder implements ComputerBuilder {
    29. private String cpu;
    30. private String ram;
    31. private String hdd;
    32. @Override
    33. public void buildCPU(String cpu) {
    34. this.cpu = cpu;
    35. }
    36. @Override
    37. public void buildRAM(String ram) {
    38. this.ram = ram;
    39. }
    40. @Override
    41. public void buildHDD(String hdd) {
    42. this.hdd = hdd;
    43. }
    44. @Override
    45. public Computer build() {
    46. return new Computer(cpu, ram, hdd);
    47. }
    48. }
    49. // 导演者
    50. class Director {
    51. public Computer constructComputer(ComputerBuilder builder) {
    52. builder.buildCPU("Intel i7");
    53. builder.buildRAM("16GB DDR4");
    54. builder.buildHDD("1TB SSD");
    55. return builder.build();
    56. }
    57. }
    58. // 客户端代码
    59. public class Main {
    60. public static void main(String[] args) {
    61. Director director = new Director();
    62. ComputerBuilder desktopBuilder = new DesktopBuilder();
    63. Computer computer = director.constructComputer(desktopBuilder);
    64. System.out.println(computer); // 输出:Computer{cpu='Intel i7', ram='16GB DDR4', hdd='1TB SSD'}
    65. }
    66. }

    在这个Java示例中:

    • Computer类是复杂的产品对象,包含CPU、RAM和HDD三个部件。
    • ComputerBuilder接口定义了构建计算机各个部件的方法,以及返回完整计算机对象的方法。
    • DesktopBuilder类实现了ComputerBuilder接口,提供了构建计算机部件的具体实现。
    • Director类负责调用DesktopBuilder的构建方法,按照特定顺序构建计算机,并返回构建完成的计算机对象。
    • 客户端代码通过Director来构建计算机,无需关心具体的构建细节。如果需要构建不同类型的计算机(如笔记本电脑),只需创建新的具体建造者类并传递给Director即可。

    代码示例(以Python为例) 

    1. # 产品(复杂对象)
    2. class Computer:
    3. def __init__(self, cpu, ram, hdd):
    4. self.cpu = cpu
    5. self.ram = ram
    6. self.hdd = hdd
    7. def __str__(self):
    8. return f"Computer(cpu={self.cpu}, ram={self.ram}, hdd={self.hdd})"
    9. # 抽象建造者
    10. class ComputerBuilder:
    11. def build_cpu(self, cpu):
    12. raise NotImplementedError("Subclasses must implement this method")
    13. def build_ram(self, ram):
    14. raise NotImplementedError("Subclasses must implement this method")
    15. def build_hdd(self, hdd):
    16. raise NotImplementedError("Subclasses must implement this method")
    17. def build(self):
    18. raise NotImplementedError("Subclasses must implement this method")
    19. # 具体建造者
    20. class DesktopBuilder(ComputerBuilder):
    21. def __init__(self):
    22. self.cpu = None
    23. self.ram = None
    24. self.hdd = None
    25. def build_cpu(self, cpu):
    26. self.cpu = cpu
    27. def build_ram(self, ram):
    28. self.ram = ram
    29. def build_hdd(self, hdd):
    30. self.hdd = hdd
    31. def build(self):
    32. return Computer(self.cpu, self.ram, self.hdd)
    33. # 导演者
    34. class Director:
    35. def construct_computer(self, builder):
    36. builder.build_cpu("Intel i7")
    37. builder.build_ram("16GB DDR4")
    38. builder.build_hdd("1TB SSD")
    39. return builder.build()
    40. # 客户端代码
    41. def main():
    42. director = Director()
    43. builder = DesktopBuilder()
    44. computer = director.construct_computer(builder)
    45. print(computer) # 输出:Computer(cpu=Intel i7, ram=16GB DDR4, hdd=1TB SSD)
    46. if __name__ == "__main__":
    47. main()

    在这个Python示例中:

    • Computer类是复杂的产品对象,包含CPU、RAM和HDD三个部件,并提供了__str__方法以便打印输出。
    • ComputerBuilder类作为抽象建造者,定义了构建计算机各个部件的方法(build_cpubuild_rambuild_hdd)以及返回完整计算机对象的build方法,这些方法在抽象类中均抛出NotImplementedError,要求子类必须实现。
    • DesktopBuilder类继承自ComputerBuilder,实现了具体构建计算机部件的方法,并在build方法中返回一个新建的Computer实例。
    • Director类负责调用DesktopBuilder的构建方法,按照特定顺序构建计算机,并返回构建完成的计算机对象。
    • 客户端代码通过Director来构建计算机,无需关心具体的构建细节。如果需要构建不同类型的计算机(如笔记本电脑),只需创建新的具体建造者类并传递给Director即可。
  • 相关阅读:
    python最常用的三种输出格式
    中建三局,宁德时代,金证科技,途游游戏,得物,蓝禾,顺丰,康冠科技24春招内推
    html+javascript 编写的自动根据当前时间问好 早上 中午下午 晚上 还有下班倒计时等等
    vue之diff算法
    kubernetes(5) 续4
    css层叠样式设置
    基于微信小程序的二手交易平台源码
    【leetcode】2273. 移除字母异位词后的结果数组(js实现)
    Matlab:指定时区
    云原生(三十一) | Kubernetes篇之Kubernetes平台基本预装资源
  • 原文地址:https://blog.csdn.net/piaomiao_/article/details/137950367