设计模式--builder--创建型
Builder模式的缘起
• 假设创建游戏中的一个房屋House设施,该房屋的构建由几
个部分组成,且各个部分要富于变化。
• 如果使用最直观的设计方法,每一个房屋部分的变化,都
将导致房屋构建的重新修正……
构件房屋的序列不变
动机(Motivation)
在软件系统中,有时候面临着“一个复杂对象”的创建工作,
其通常由各个部分的子对象用一定的算法构成;由于需求
的变化,这个复杂对象的各个部分经常面临着剧烈的变
化,但是将它们组合在一起的算法却相对稳定。
如何应对这种变化?如何提供一种“封装机制”来隔离出“复
杂对象的各个部分”的变化,从而保持系统中的“稳定构建算
法”不随着需求改变而改变?
意图(Intent)
将一个复杂对象的构建与其表示相分离,使得同样
的构建过程可以创建不同的表示。
——《设计模式》GoF
结构(Structure)
协作(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 就是通过
{
}
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,