设计模式之建造者模式与工厂方法模式

来源:互联网 发布:网络翻唱女歌手排行榜 编辑:程序博客网 时间:2024/05/02 01:52

    建造者模式:

               将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

    建造者模式结构图:

       

            产品类(Product):一般是一个较为复杂的对象,也就是说创建对象的过程比较复杂,一般会有比较多的代码量。在本图中,产品类是一个具体的类,而非抽象类。实际编程中,产品类可以是由一个抽象类与它的不同实现组成,也可以是由多个抽象类与他们的实现组成。   

          具体建造者(ConcreteBuilder):实现Builder接口,构造和装配各个部件。即组建产品和返回组建好的产品。

          抽象建造者(Builder):是为创建一个Product对象的各个部件指定的抽象接口。这样更容易扩展。一般至少会有两个抽象方法,一个用来建造产品,一个是用来返回产品。

          指挥者(Director):构建一个使用Builder接口的对象,负责调用适当的建造者来组建产品,导演类一般不与产品类发生依赖关系,与导演类直接交互的是建造者类。一般来说,导演类被用来封装程序中易变的部分。

   适用性:

             1、需要生成的产品对象有复杂的内部结构。 
             2、需要生成的产品对象的属性相互依赖,建造者模式可以强迫生成顺序。 
             3、 在对象创建过程中会使用到系统中的一些其它对象,这些对象在产品对象的创建过程中不易得到。

     优越性:

  • 封装性

                               使用建造者模式可以使客户端不必知道产品内部组成的细节,如例子中我们就不需要关心每一个具体的模型内部是如何实现的,产生的对象类型就是CarModel。

  • 建造者独立,容易扩展

                               Builder之间是相互独立的,与其它的Builder无关,对系统的扩展非常有利。

  • 便于控制细节风险

                         模式所建造的最终产品更易于控制:由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响。

     举例:

        在电脑城装机总有这样的经历。我们到了店里,先会有一个销售人员来询问你希望装的机器是怎么样的配置,他会给你一些建议,最终会形成一张装机单。和客户确定了装机配置以后,他会把这张单字交给提货的人,由他来准备这些配件,准备完成后交给装机技术人员。技术人员会把这些配件装成一个整机交给客户。

                 不管是什么电脑,它总是由CPU、内存、主板、硬盘以及显卡等部件构成的,并且装机的过程总是固定的:

                       把主板固定在机箱中

                       把CPU安装到主板上

                       把内存安装到主板上

                       把硬盘连接到主板上

                       把显卡安装到主板上

                 但是,每台兼容机的部件都各不相同的,有些配置高一点,有些配置低一点,这是变化点。对于装机技术人员来说,他不需要考虑这些配件从哪里来的,他只需要把他们组装在一起了,这是稳定的装机流程。要把这种变化的配件和稳定的流程进行分离就需要引入Builder模式。

                  在这里:销售人员就属于指挥者,提货人员属于抽象建造者,而又技术人员属于具体建造者,最终生产出的电脑就是建造者模式中的产品类了。 

  与工厂模式的区别:               

          在之前的博客中,已经介绍过工厂模式,可以看出,建造者模式仅仅只比工厂模式多了一个“指挥类”的角色。在建造者模式图中,假如把这个指挥类看做是最终调用的客户端,那么图中剩余的部分就可以看作是一个简单的工厂模式了。

                  与工厂模式相比,建造者模式一般用来创建更为复杂的对象,因为对象的创建过程更为复杂,因此将对象的创建过程独立出来组成一个新的类——指挥类。也就是说,工厂模式是将对象的全部创建过程封装在工厂类中,由工厂类向客户端提供最终的产品;而建造者模式中,建造者类一般只提供产品类中各个组件的建造,而将具体建造过程交付给导演类。由导演类负责将各个组件按照特定的规则组建为产品,然后将组建好的产品交付给客户端。



1 0
原创粉丝点击