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

    建造者模式:

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

    建造者模式结构图:

       

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

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

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

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

   适用性:

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

     优越性:

  • 封装性

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

  • 建造者独立,容易扩展

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

  • 便于控制细节风险

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

     举例:

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

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

                       把主板固定在机箱中

                       把CPU安装到主板上

                       把内存安装到主板上

                       把硬盘连接到主板上

                       把显卡安装到主板上

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

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

  与工厂模式的区别:               

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

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

时间: 2024-08-25 09:47:55

设计模式之建造者模式与工厂方法模式的相关文章

设计模式系列之二:工厂方法模式

前言 前一篇博文中介绍了简单工厂模式,这里再介绍一下工厂方法模式.与简单工厂很像,那么两者的区别是什么呢?在这篇博文中,首先会简单介绍一下工厂方法的使用方法,并对工厂方法模式进行简单的小结.最后,将结合具体的例子对比简单工厂模式与工厂方法模式,并对两者的使用场景做一个小小的归纳. 问题背景 背景: 某公司开发了一个A软件,数据库使用的是SQLServer.后由于客户要求需要使用Oracle数据库,原来的数据要迁移到Oracle中,在迁移的过程中遇到很多问题,比如语法错误,关键字滥用,函数不支持等

简单工厂模式VS工厂方法模式

  前面学习了简单工厂模式,理解的不是很深刻,今天刚好看到了工厂方法模式,比较一下也加深对前面的理解.   首先无论是简单工厂模式还是工厂方法模式都是把不变的地方提取出来,把容易发生变化的封装起来.以达到做大程度的复用,和适应用户的变动,以及项目的扩展. 简单工厂模式 理解   又称为静态工厂模式,它专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有相通的父类.由工厂类根据传入的参数动态决定应该创建哪一个产品类的实例.它包含必要的判断逻辑,能根据外界给定的信息,决定应该穿件那个具体类的

设计模式的C++实现之工厂方法模式

工厂方法模式不同于简单工厂模式的地方在于工厂方法模式把对象的创建过程放到里子类里.这样工厂父对象和产品父 对象一样,可以是抽象类或者接口,只定义相应的规范或操作,不涉及具体的创建或实现细节. 其类图如下: 实例代码为: #pragma once class IProduct { public: IProduct(void); virtual ~IProduct(void); }; #pragma once #include "iproduct.h" class IPad : publi

Ruby中使用设计模式中的简单工厂模式和工厂方法模式_ruby专题

之前有看过<ruby设计模式>,不过渐渐的都忘记了.现在买了一个大话设计模式,看起来不是那么枯燥,顺便将代码用ruby实现了一下. 简单工厂模式: # -*- encoding: utf-8 -*- #运算类 class Operation attr_accessor :number_a,:number_b def initialize(number_a = nil, number_b = nil) @number_a = number_a @number_b = number_b end d

java中简单工厂模式、工厂方法模式、抽象工厂模式介绍

工厂模式适合凡是出现大量对象需要创建,而且这些对象拥有相同的接口,可以使用工厂模式进行创建. 简单工厂模式 简单工厂模式分为三种:普通工厂模式.多个方法工厂模式.静态方法工厂模式 -------------------------------------------------------------------------------- 以发送QQ消息或者微信消息为例来说明: 普通工厂模式 /**  * 两种共同的接口  */ public interface Message {     pu

.NET设计模式(5):工厂方法模式(Factory Method)

概述 在软件系统中,经常面临着"某个对象"的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口.如何应对这种变化?提供一种封装机制来隔离出"这个易变对象"的变化,从而保持系统中"其它依赖该对象的对象"不随着需求的改变而改变?这就是要说的Factory Method模式了. 意图 定义一个用户创建对象的接口,让子类决定实例化哪一个类.Factory Method使一个类的实例化延迟到其子类. 结构图 生活中

设计模式(五)之工厂方法模式

产品类型接口: public interface Car { } 产品工厂接口: public interface ICarFactory { public Car createCar(); } 产品一: public class BMW implements Car { public BMW(){ System.out.println("create BMW."); } } 产品二: public class Tesla implements Car { public Tesla()

PYTHON设计模式,创建型之工厂方法模式

我感觉和上一个差不多,可能不要动最要的地方吧...   #!/usr/bin/evn python #coding:utf8 class Pizza(object): def prepare(self, type): print 'prepare {type} pizza'.format(type=type) def bake(self, type): print 'bake {type} pizza'.format(type=type) def cut(self, type): print '

Android设计模式系列之工厂方法模式_Android

工厂方法模式,往往是设计模式初学者入门的模式,的确,有人称之为最为典型最具启发效果的模式. android中用到了太多的工厂类,其中有用工厂方法模式的,当然也有很多工厂并不是使用工厂方法模式的,只是工具管理类. 今天以ThreadFactory举例说明一下简单工厂模式和工厂方法模式. 工厂方法模式,Factory Method,简单的方式,不简单的应用. 1.意图 定义一个用于创建对象的接口,让子类决定实例化哪个类.工厂方式模式使一个类的实例化延迟到其子类. 热门词汇:虚构造器 延迟 创建对象