设计模式学习笔记四(Builder生成器模式)

来源:互联网 发布:网络剧 受众群体 编辑:程序博客网 时间:2024/05/18 02:03

动机:在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临剧烈的变化,但是将它们组合在一起的算法却相对稳定。

如何提供一种“封装机制”来隔离出“复杂对象的各个部分”的变化,从而保持系统中的“稳定构建算法”不随着需求的改变而改变。

意图:就是将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。


基本Code

//房子

public abstract class House

{

}

//

public abstract class Door

{

}

//

public abstract class Wall

{

}

//窗口

public abstract class Windows

{

}

//地板

public abstract class Floor

{

}

//屋顶

public abstract class HouseCeiling

{

}

//罗曼蒂克的房屋

public class RomanDoor:Door

{

}

public class RomanWall:Wall

{

}

public class RomanWindows:Windows

{

}

public class RomanFloor:Floor

{

}

public class RomanHouseCeiling:HouseCeiling

{

}

//建造者模式

public abstract class Builder

{

     public abstract void BuildDoor();

     public abstract void BuildWall();

     public abstract void BuildWindows();

     public abstract void BuildFloor();

     public abstract void BuilderHouseCeiling();

     public abstract House GetHouse();

}

//罗曼蒂克房子

public class RomanHouse:House

{

}

public class RomanHouseBuilder:Builder

{

     public override void BuildDoor(){}

     public override void BuildWall(){}

     public override void BuildWindows(){}

     public override void BuildFloor(){}

     public override void BuilderHouseCeiling(){}

     public override House GetHouse(){}

}

 

public class GameManager

{

     public static House CreateHouse(Builder builder)

     {

         builder. BuildDoor();

         builder. BuildDoor();

 

         builder.BuildWall();

         builder.BuildWall();

 

         builder.BuildWindows();

         builder.BuildWindows();

 

         builder.BuildFloor();

         builder.BuilderHouseCeiling();

         builder.GetHouse();

     }

}

客户端程序:

public class App

{

     public static void Main()

     {

/*由于改变了参数我们要修改客户端code,所以我们可以从配置文件中读取//Builder信息,这样的话,我们客户端的Code就不需要做作任何改动*/

        String assemblyName=ConfigurationManager.AppSettings["BuilderAssembly"];

        String builderName=ConfigurationManager.AppSettings["BuilderName"];

 

        Assembly assembly=Assembly.Load(assemblyName);

        Type t=assembly.GetType(builderName);

        Builder builder=Activator.CreateInstance(t);

        //House house=GameManager.CreateHouse(new RomanBuilder());

        House house=GameManager.CreateHouse(builder);

     }

}

如果今后修改出现新的房子模式,我们只需要从BuilderHouse继承产生新的类就可以了,无需改动客户端的Code

Builder模式的要点

1、  Builder模式主要用于“分布骤构建一个复杂的对象”。这其中的“分步骤”是一个稳定的算法,而复杂对象各个部分经常变化。

2、  变化点在那里,封装那里――Builder主要在于就对“复杂对象”各个部分的频繁需求变动。其缺点难以应对“分步骤构建算法”的变动。

3、  Abstract Factory模式解决“系列对象”的需求变化,Builder模式解决“对象部分”的需求变化。Builder模式经常和Composite模式组合使用。