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

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

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


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

结构(Structure)

设计模式--builder--创建型_第1张图片
协作(Collaborations)


abstract   class  House
{


}

abstract   class  Door
{
}

abstract   class  Window
{
}


abstract   class  Floor
{
}


public   class   RomainWall:Wall
{
}


public   class  RomainDoor:Door
{
}

public   class  RomailWindow:Window
{
}


public   class  RomainFloor : Floor
{
}


public   class  RomainDoor:Door
{
}





public   abstract   class  Builder
{
  
public abstract void BuildDoor();
  
public abstract void BuildWall();
  
public abstract void BuildWindows();
  
public abstract void BuildDoor();

  
public abstract void BuildFloor();
  
  
public abstract House GetHouse();
  
}


  
public   class  RomainHouse : House
{
   

}

public   class  RomainHouseBuilder : Builder
{
public voerride void BuildDoor()
{}
 
public voerride void BuildWall()
{}  
public voerride void BuildWindows()
{}  
public voerride void BuildDoor()
{}  
public voerride void BuildFloor()
{}  
public voerride void BuildWindows()
{}

}

  
public   class  GameManager
{
 
   
public static House CreateHouse(Builder builder)
{   this.builer=builer}   
                     
///////稳定的
    builder.BuildDoor();
    builder.BuildDoor();


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

   builder.BuildWall(); 
   builder.BuildWall();
   builder.BuildWall();
   builder.BuildWall();

  
return buider.GetHouse():
  }


}

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

}


补充一下 java 的 的写法 
// 配置文家可以是 propeties 或 xml 
   
// ClassLoader cl=Thread.currentThread().getContextClassLoader(); 
   
//   Builder builder =cl.loadClass("Builder");
   从被装载的路径使用自己装载器来装载Servlet类
// Class servletClass =
  //  loader.loadClass(m_config.getInitParameter( "servlet");
    //Builder builder= (Builder)servletClass.newInstance();
  Builder builder 
=   (MyClass) Class.forName(classname).newInstance();  // classname 就是通过




 

 

 

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

应用 asp.net ,struts ,jsf,

你可能感兴趣的:(设计模式--builder--创建型)