导航

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

适用性:

  • 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
  • 当构造过程必须允许被构造的对象有不同的表示时。


结构:


using System;
using System.Configuration;

namespace DesignPattern
{
 /// <summary>
 /// Builder 的摘要说明。
 /// 缘起:假设创建游戏中的一个房屋House设施,该房屋的构建由几个部分组成,且各部分富于变化
 ///   如果使用最直观的设计方法,每个房屋部分的变化,都将导致房屋构建的重新修正
 /// 动机:软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象
 ///   用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临剧烈的变化,但
 ///   是将他们组合在一起的算法却相对稳定
 ///   如何应对这种变化?如何提供一种“封装机制”来隔离出“复杂对象的各个部分”的变化,
 ///   从而保持系统中的“稳定构建算法”不随着需求改变而改变
 /// 意图:将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示
 /// 要点:Builder模式主要用于“分步骤构建一个复杂的对象”。在这其中“分步骤”是一个稳定的算法
 ///   ,而复杂对象的各个部分则经常变化
 ///   变化点在哪里,封装哪里——Builder模式主要在于应对“复杂对象各个部分”的频繁需求变
 ///   动。其缺点在于难以应对“分步骤构建算法”的需求变动。
 ///   AbstractFactory模式解决“系列对象”的需求变化,Builder模式解决“对象部分”的需求
 ///   变化。Builder模式通常和Composite模式组合使用
 ///   
 /// 关闭修改,开放扩展!!
 /// 问:接口与抽象类一般放在与客户程序的同一项目还是单独项目
 /// 答:单独!抽象类和接口放在单独不同项目中,客户程序引用它
 /// </summary>
 public abstract class House
 {
 
 }
 public abstract class Builder
 {
  public abstract void BuildDoor();
  public abstract void BuildWall();
  public abstract void BuildWindows();
  public abstract void BuildFloor();
  public abstract void BuildHouseCeiling();
  
  public abstract House GetHouse();

  public Builder()
  {
  
  }
 }
 //另外文件中..
 public class BuilderGameManager
 {
  public static House CreateHouse(Builder builder)
  {//相对稳定的部分
   builder.BuildDoor();
   builder.BuildDoor();
   
   builder.BuildWall();
   builder.BuildWall();
   builder.BuildWall();
   builder.BuildWall();

   builder.BuildWindows();
   builder.BuildWindows();

   builder.BuildFloor();
   builder.BuildHouseCeiling();

   return builder.GetHouse();
  }
 }
 //另外文件中..
 public class RomanHouse : House
 {
 
 }
 public class RomanDoor : Door
 {
 
 }
 public class RomanWall : Wall
 {
 
 }
 public class RomanWindows :Windows
 {
 
 }
 public class RomanFloor : Floor
 {
 
 }
 public class RomanHouseCeiling : HouseCeiling
 {
 
 }
 public class RomanHouseBuilder : Builder
 {
  public override void BuildDoor()
  {
  
  }
  public override void BuildWall()
  {
  
  }
  public override void BuildWindows()
  {
  
  }
  public override void BuildFloor()
  {
  
  }
  public override void BuildHouseCeiling()
  {
  
  }

  public override House GetHouse()
  {
   return null;
  }

 }

 //另外的文件..
 class BuilderApp
 {
  public static void Main()
  {
   string assemblyName = ConfigurationSettings["BuilderAssembly"];
   string buildername = ConfigurationSettings["BuilderClass"];
   
   Assembly assembly = Assembly.Load(assemblyName);

   Type t = assembly.GetType(builderName);

   Builder builder = Activator.CreateInstance(t);

   House house =
    BuilderGameManager.CreateHouse(new RomanHouseBuilder());
  }
 }
}