• 建造者模式(Builder)


    建造者模式(Builder)将复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

    建造者模式通常包括下面几个角色:

    1. 生成器builder:给出一个抽象接口,以规范产品对象的各个组成成分的建造。这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建。

                             为创建一个Product对象的各个部件指定抽象接口;

    2. ConcreteBuilder:实现Builder接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建。 在建造过程完成后,提供产品的实例。

                                定义并明确它所创建的表示;

                                提供一个检索Product的接口;

    3. 导向器Director:调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。

                                构造一个使用Builder接口的对象;

    4. Product:表示要创建的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程;

                      包含定义组成部件的类,包括将这些部件装配成最终产品的接口。

    在建造者模式中,Director规定了创建一个对象所需要的步骤和次序,Builder则提供了一些列完成这些步骤的方法,ConcreteBuilder给出了这些方法的具体实现,是对象的直接创建者。

                                                                         建造者模式的结构图

                      

    协作
    • 客户创建Director对象,并用它所想要的Builder对象进行配置。
    • 一旦产品部件被生成,导向器就会通知生成器。
    • 生成器处理导向器的请求,并将部件添加到该产品中。
    • 客户从生成器中检索产品。

    使用建造者模式的好处:

    1.使用建造者模式可以使客户端不必知道产品内部组成的细节。它使你可以改变一个产品的内部表示;
    Builder对象提供给导向器一个构造产品的抽象接口。该接口使得生成器可以隐藏这个产品的表示和内部结构。它同时也隐藏了该产品是如何装配的。因为产品是通过抽象接口构造的,你在改变该产品的内部表示时所要做的只是定义一个新的生成器。

    2.具体的建造者类之间是相互独立的,对系统的扩展非常有利。它将构造代码和表示代码分开;

    Builder模式通过封装一个复杂对象的创建和表示方式提高了对象的模块性。客户不需要知道定义产品内部结构的类的所有信息;这些类是不出现在Builder接口中的。每个ConcreteBuilder包含了创建和装配一个特定产品的所有代码。这些代码只需要写一次;然后不同的Director可以复用它以在相同部件集合的基础上构作不同的Product。

    3.由于具体的建造者是独立的,因此可以对建造过程进行更精细的控制,而不对其他的模块产生任何影响。

    Builder模式与一下子就生成产品的创建型模式不同,它是在导向者的控制下一步一步构造产品的。仅当该产品完成时导向者才从生成器中取回它。因此Builder接口相比其他创建型模式能更好的反映产品的构造过程。这使你可以更精细的控制构建过程,从而能更精细的控制所得产品的内部结构。

    使用建造模式的场合:

    1.创建一些复杂的对象时,这些对象的内部组成构件间的建造顺序是稳定的,但是对象的内部组成构件面临着复杂的变化。

    2.要创建的复杂对象的算法,独立于该对象的组成部分,也独立于组成部分的装配方法时。
    3. 当构造过程必须允许被构造的对象有不同的表示时。

    相关模式
    Abstract Factory(3 . 1)与Builder相似,因为它也可以创建复杂对象。主要的区别是Builder模式着重于一步步构造一个复杂对象。而 Abstract Factory着重于多个系列的产品对象(简单的或是复杂的) 。Builder在最后的一步返回产品,而对于 Abstract Factory来说,产品是立即返回的。
    Composite(4.3)通常是用Builder生成的。

  • 相关阅读:
    C#的默认访问权限
    隐藏基类成员
    索引指示器的重载
    索引指示器
    vector
    string 函数
    细胞个数
    计蒜客 T1096 石头剪刀布
    计蒜客 T1125 判断字符串是否为回文
    计蒜客 T1152 成绩排序
  • 原文地址:https://www.cnblogs.com/ctddjyds/p/5889801.html
Copyright © 2020-2023  润新知