设计模式学习笔记--Builder生成器模式

   GOF《设计模式》中说道:将一个复杂对象的构建与其表示向分离,使得同样的构建过程可以创建不同的表示。
   所谓“复杂对象”,是指:此对象中还含有其它的子对象。
   何时采用: Builder模式所面对的情况是:各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将他们组合在一起的算法却相对稳定。简单的说:子对象变化较频繁,组合算法相对稳定。比如生产汽车,理想状态下,生产步骤基本相同,只是不同的车款其具体部件有所不同,变化的是部件,稳定的是生产流程,在此种情况下就采用Builder生成器模式。还比如组装电脑,组装步骤也基本就是那些步骤,但不同的使用了不同的配件,所以也适合此模式。
   因此,这是解决一个复杂对象的创建工作,现在变化的部分和相对稳定的部分已经明确,我们要做的是隔离变化,如何将子对象和算法隔离是要解决的问题。
   我们现在定义一个场景:用Builder生成器生产汽车,在此处,我们有两个车款需要生产,它们是BMW或TOYOTA。
   下面我们按下面步骤来实现我们的Builder生成器模式
   一、抽象建造者角色:CarBuilder。它主要是用来定义两种接口,一种接口用于规范产品的各个部分的组成。比如,这里就规定了汽车五个重要组成部件的组成。第二种接口用于返回建造后的产品。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CarBuilderPattern
{
    
定义产品各个部件的抽象类

    
定义产品抽象类


    
//建造者(Builder)角色:给出一个抽象接口,以规范产品对象的各个组成部分的建造。一般而言,此接口独立于应用程序的商业逻辑。
    
//模式中直接创建产品对象的是具体建造者(ConcreteBuilder)角色。具体建造者类必须实现这个接口所要求的方法:一个是建造方法,另一个是结果返还方法。

    
定义建造者角色(也是一个抽象类,无具体实现)

}

  二、建造者模式的指导者:CarFactoryManager。指导者做的是稳定的建造工作,他按照固定的流程,重复做着相同的装配工作。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CarBuilderPattern
{
    
//此部分是最稳定的,不会因为车款的变化而变化
    
//因为此处定义了一个造车的流程,不管造什么车,基本流程大致相同
    class CarFactoryManager
    
{
        
//具体建造者(Concrete Builder)角色:担任这个角色的是于应用程序紧密相关的类,它们在应用程序调用下创建产品实例。
        
//这个角色主要完成的任务包括:实现Builder角色提供的接口,一步一步完成创建产品实例的过程;在建造过程完成后,提供产品的实例。

        
public static Car CreateCars(Builder builder,string BrandName)
        
{
          
            
一步一步完成创建产品实例的过程

            
提供产品的实例


        }

    }

}

  三、具体的建造者:BMWCar和TOYOTACar。他的工作就是实现各建造步骤的接口,以及实现返回产品的接口。
    宝马车建造者
  

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CarBuilderPattern
{
    
//此部分是经常变化的

    
宝马车各部件的具体定义类:继承各部件的抽象类

    
定义一个具体产品类:宝马车,它继承自前面定义的抽象类Car

    
具体实现宝马车的Builder
}

   丰田车建造者

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CarBuilderPattern
{
    
丰田车各部件的具体定义类:继承各部件的抽象类

    
定义一个具体产品类:丰田车,它继承自前面定义的抽象类Car

    
具体实现丰田车的Builder
}

  四、 Car就是建造出来的复杂产品--汽车。在代码中,我们的各种建造步骤都是为创建产品中的各种配件服务的,Car定义了一个相对具体的产品,在应用中可以把这个产品进行比较高度的抽象,使得不同的具体建造者甚至可以建造出完全不同的产品。


  五、 看看客户端的代码,用户先是选择了一个具体的Builder,BMWCar或TOYOTACar,然后交由Builder工厂给他生产出相应的汽车产品。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CarBuilderPattern
{
    
class Program
    {
        
static void Main(string[] args)
        {
            
//指导者(Director)角色:担任这个角色的类调用具体建造者角色(BMWBuilder)以创建产品对象。
            
//导演者并没有产品类的具体知识,真正拥有产品类的具体知识的是具体建造者对象。

           Car mycaBMW
= CarFactoryManager.CreateCars(new  BMWBuilder(),"宝马车");

           Car mycarToyota 
= CarFactoryManager.CreateCars(new TOYOTABuilder(), "丰田车");
           Console.Read();


        }
    }
}


前往:设计模式学习笔记清单
posted @ 2009-09-25 09:37  wsdj  阅读(1007)  评论(1编辑  收藏  举报