主讲:李建忠
来源:http://www.microsoft.com/china/msdn/events/webcasts/shared/webcast/consyscourse/CsharpOOD.aspx
Builderpublic abstract class House { } public abstract class Door { } public abstract class Wall { } public abstract class Windows { } public abstract class Floor { } public abstract class HouseCeiling { } public abstract class HouseBuilder { //房屋的各个部分 public abstract void BuildDoor(); public abstract void BuildWall(); public abstract void BuildWindows(); public abstract void BuildFloor(); public abstract void BuildHouseCeiling(); public abstract House GetHouse(); }
GameManagerpublic class GameManager { //构造房屋(复杂对象)的算法 public static House CreateHouse(Builder builder) { //部分对象构造的次数可以通过数据库或配置文件来控制 builder.BuildDoor(); builder.BuildDoor(); builder.BuildWall(); builder.BuildWall(); builder.BuildWindows(); builder.BuildWindows(); builder.BuildFloor(); builder.BuildHouseCeiling(); return builder.GetHouse(); } }
RomanHouseBuilderpublic 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:HouseBuilder { public override void BuildDoor() { } public override void BuildWall() { } public override void BuildWindows() { } public override void BuildFloor() { } public override void BuildHouseCeiling() { } public override House GetHouse() { } }
Clientclass App { public static void Main() { //对于风格的变化(罗马风格或经典风格),可以通过配置文件+动态反射来解决 string assemblyName=configurationSetting["BuilderAssembly"]; string builderName=configurationSetting["BuilderClass"]; Assembly assembly=Assembly.Load(assemblyName); Type t=assembly.GetType("builderName"); Builder builder=Activator.CreateInstance(t); House house=GameManager.CreateHouse(new RomanHouseBuilder()); } }