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

本文探讨了Builder模式的应用场景,即在面对复杂对象构建时如何通过分离构建过程与表示来应对变化。详细介绍了Builder模式的结构、协作方式及其实现示例,并讨论了其与Abstract Factory模式的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 就是通过




 

 

 

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

应用 asp.net ,struts ,jsf,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值