设计模式--builder--创建型

Builder模式的缘起
• 假设创建游戏中的一个房屋House设施,该房屋的构建由几
个部分组成,且各个部分要富于变化。
• 如果使用最直观的设计方法,每一个房屋部分的变化,都
将导致房屋构建的重新修正……
构件房屋的序列不变

动机(Motivation)
在软件系统中,有时候面临着“一个复杂对象”的创建工作,
其通常由各个部分的子对象用一定的算法构成;由于需求
的变化,这个复杂对象的各个部分经常面临着剧烈的变
化,但是将它们组合在一起的算法却相对稳定。
如何应对这种变化?如何提供一种“封装机制”来隔离出“复
杂对象的各个部分”的变化,从而保持系统中的“稳定构建算
法”不随着需求改变而改变?


意图(Intent)
将一个复杂对象的构建与其表示相分离,使得同样
的构建过程可以创建不同的表示。
——《设计模式》GoF

结构(Structure)

设计模式--builder--创建型
协作(Collaborations)

设计模式--builder--创建型


设计模式--builder--创建型abstract class House
设计模式--builder--创建型设计模式--builder--创建型
...{
设计模式--builder--创建型
设计模式--builder--创建型
设计模式--builder--创建型}

设计模式--builder--创建型
abstract class Door
设计模式--builder--创建型设计模式--builder--创建型
...{
设计模式--builder--创建型}

设计模式--builder--创建型
abstract class Window
设计模式--builder--创建型设计模式--builder--创建型
...{
设计模式--builder--创建型}

设计模式--builder--创建型
设计模式--builder--创建型
abstract class Floor
设计模式--builder--创建型设计模式--builder--创建型
...{
设计模式--builder--创建型}

设计模式--builder--创建型
设计模式--builder--创建型
public class  RomainWall:Wall
设计模式--builder--创建型设计模式--builder--创建型
...{
设计模式--builder--创建型}

设计模式--builder--创建型
设计模式--builder--创建型
public class RomainDoor:Door
设计模式--builder--创建型设计模式--builder--创建型
...{
设计模式--builder--创建型}

设计模式--builder--创建型
public class RomailWindow:Window
设计模式--builder--创建型设计模式--builder--创建型
...{
设计模式--builder--创建型}

设计模式--builder--创建型
设计模式--builder--创建型
public class RomainFloor : Floor
设计模式--builder--创建型设计模式--builder--创建型
...{
设计模式--builder--创建型}

设计模式--builder--创建型
设计模式--builder--创建型
public class RomainDoor:Door
设计模式--builder--创建型设计模式--builder--创建型
...{
设计模式--builder--创建型}

设计模式--builder--创建型
设计模式--builder--创建型
设计模式--builder--创建型
设计模式--builder--创建型
设计模式--builder--创建型
public abstract class Builder
设计模式--builder--创建型设计模式--builder--创建型
...{
设计模式--builder--创建型  
public abstract void BuildDoor();
设计模式--builder--创建型  
public abstract void BuildWall();
设计模式--builder--创建型  
public abstract void BuildWindows();
设计模式--builder--创建型  
public abstract void BuildDoor();
设计模式--builder--创建型
设计模式--builder--创建型  
public abstract void BuildFloor();
设计模式--builder--创建型  
设计模式--builder--创建型  
public abstract House GetHouse();
设计模式--builder--创建型  
设计模式--builder--创建型}

设计模式--builder--创建型
设计模式--builder--创建型  
public class RomainHouse : House
设计模式--builder--创建型设计模式--builder--创建型
...{
设计模式--builder--创建型   
设计模式--builder--创建型
设计模式--builder--创建型}

设计模式--builder--创建型
public class RomainHouseBuilder : Builder
设计模式--builder--创建型设计模式--builder--创建型
...{
设计模式--builder--创建型
public voerride void BuildDoor()
设计模式--builder--创建型设计模式--builder--创建型
...{}
设计模式--builder--创建型 
public voerride void BuildWall()
设计模式--builder--创建型设计模式--builder--创建型
...{}  
设计模式--builder--创建型
public voerride void BuildWindows()
设计模式--builder--创建型设计模式--builder--创建型
...{}  
设计模式--builder--创建型
public voerride void BuildDoor()
设计模式--builder--创建型设计模式--builder--创建型
...{}  
设计模式--builder--创建型
public voerride void BuildFloor()
设计模式--builder--创建型设计模式--builder--创建型
...{}  
设计模式--builder--创建型
public voerride void BuildWindows()
设计模式--builder--创建型设计模式--builder--创建型
...{}
设计模式--builder--创建型
设计模式--builder--创建型}

设计模式--builder--创建型  
public class GameManager
设计模式--builder--创建型设计模式--builder--创建型
...{
设计模式--builder--创建型 
设计模式--builder--创建型   
public static House CreateHouse(Builder builder)
设计模式--builder--创建型设计模式--builder--创建型
...{   this.builer=builer}   
设计模式--builder--创建型设计模式--builder--创建型                     
/**////////稳定的
设计模式--builder--创建型    builder.BuildDoor();
设计模式--builder--创建型    builder.BuildDoor();
设计模式--builder--创建型
设计模式--builder--创建型
设计模式--builder--创建型   builder.BuildWindows();
设计模式--builder--创建型   builder.BuildWindows();
设计模式--builder--创建型
设计模式--builder--创建型   builder.BuildWall(); 
设计模式--builder--创建型   builder.BuildWall();
设计模式--builder--创建型   builder.BuildWall();
设计模式--builder--创建型   builder.BuildWall();
设计模式--builder--创建型
设计模式--builder--创建型  
return buider.GetHouse():
设计模式--builder--创建型  }

设计模式--builder--创建型
设计模式--builder--创建型}
设计模式--builder--创建型
设计模式--builder--创建型
class App
设计模式--builder--创建型设计模式--builder--创建型
...{
设计模式--builder--创建型 
public static void Main()
设计模式--builder--创建型设计模式--builder--创建型
...{
设计模式--builder--创建型  
string assemblyName=ConfigurationSettings["BuilderAssembly"]; //这里就是用到配置文件
设计模式--builder--创建型
  string builderName=ConfigurationSettings["BuilderClass"];   //可以让用配置文件来更换builder
设计模式--builder--创建型
  Assembly assembly=Assembly.Load(assemblyName);
设计模式--builder--创建型  Type t
=assembly.GetType["builderName"];
设计模式--builder--创建型  Builder builder
=Activator.CreateInstance(t);
设计模式--builder--创建型  House house
= GameManager.CreateHouse(builder);
设计模式--builder--创建型}

设计模式--builder--创建型}

设计模式--builder--创建型
设计模式--builder--创建型补充一下 java 的 的写法 
//配置文家可以是 propeties 或 xml 
设计模式--builder--创建型   
//ClassLoader cl=Thread.currentThread().getContextClassLoader(); 
设计模式--builder--创建型   
//  Builder builder =cl.loadClass("Builder");
设计模式--builder--创建型
   从被装载的路径使用自己装载器来装载Servlet类
// Class servletClass =
  //  loader.loadClass(m_config.getInitParameter( "servlet");
    //Builder builder= (Builder)servletClass.newInstance();

设计模式--builder--创建型  Builder builder 
=  (MyClass) Class.forName(classname).newInstance(); //classname 就是通过
设计模式--builder--创建型

设计模式--builder--创建型
设计模式--builder--创建型
设计模式--builder--创建型
设计模式--builder--创建型

设计模式--builder--创建型

 

 

 

Builder 模式的几个要点
• Builder 模式主要用于“分步骤构建一个复杂的对
象”。在这其中“分步骤”是一个稳定的算法,而复
杂对象的各个部分则经常变化。
• 变化点在哪里,封装哪里—— Builder模式主要在
于应对“复杂对象各个部分”的频繁需求变动。其
缺点在于难以应对“分步骤构建算法”的需求变动。
• Abstract Factory模式解决“系列对象”的需求变
化,Builder模式解决“对象部分”的需求变化。
Builder模式通常和Composite模式组合使用。

应用 asp.net ,struts ,jsf,