1.       Builder 生成器(创建型模式

Ø         动机(Motivation)

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

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

Ø         意图(Intent)

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

Ø         结构(Structure)

Ø         协作图(Collaboration)

Ø         要点

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

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

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

Ø         示例代码

    模拟在游戏中创建不同风格的房屋的过程

//Build.cs

    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 abstract class Builder

    {

        public abstract void BuildDoor();

        public abstract void BuildWall();

        public abstract void BuildWindows();

        public abstract void BuildFloor();

        public abstract void BuildHouseCeiling();

        public abstract House GetHouse();

    }

    //RomanBuilder.cs

    public class Romain : House

    {

    }

    public class RomanDoor : Door

    {

    }

    public class RomanWall : Wall

    {

    }

    public class RomanWindows : Windows

    {

    }

    public class RomanWall : Wall

    {

    }

    public class RomanFloor : Floor

    {

    }

    public class RomanHouseCeiling : HouseCeiling

    {

    }

    public class RomanHoseBuilder : Builder

    {

        public override void BuildDoor()

        {

        }

        public override void BuildWall()

        {

       

        }

        public override void BuildWindows()

        {

       

        }

        public override void BuildFloor()

        {

       

        }

        public override void BuildHouseCeiling()

        {

       

        }

        public override House GetHouse()

        {

       

        }

    }

    //GameManger.Cs

    public class GameManager

    {

        public static House CreateHouse(Builder builder)

        {

            builder.BuildWall();

            builder.BuildWall();

            builder.BuildWall();

            builder.BuildWall();

            builder.BuildDoor();

            builder.BuildDoor();

            builder.BuildWindows();

            builder.BuildWindows();

            builder.BuildFloor();

            builder.BuildHouseCeiling();

            return builder.GetHouse();

        }

    }

    //Client.cs

    class App

    {

        public static void Main()

        {

            string assemblyName = ConfigurationSettings["BuilderAssebmly"];

            string builderName = ConfigurationSettings["BuilderRoman"];

            Assembly assembly = Assembly.Load(assemblyName);

            Type t = assembly.GetType("builderName");

            Builder builder = Activator.CreateInstance(t);

            House house = GameManager.CreateHouse(builder);

        }

    }