跟李建忠老师学设计模式-生成器模式

   1.动机:在软件系统中,有时面临着“一个复杂对象”的创建工作,其通常由各个不忍的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。我们应该提供一种“封装机制”来隔离出“复杂对象的各个部分”的变化。
   2.意图:讲一个复杂的对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。《设计模式》GoF
   3.要点:主要用于分步骤的构建一个复杂对象。变化点在那里,封装那里,难以应当“分步骤构建算法”。Abstract Factory模式解决“系列对象”的需求变化,Builder模式解决“对象部分”的需求变化
   3.实例
    //抽象House类
    public  abstract class House
    {
       
    }

    public abstract class Door
    {
   
    }
    public abstract class Windows
    {

    }

    /// <summary>
    /// Builder类,封装变化点
    /// </summary>
    public abstract class Builder
    {
        //变化的部分
        public abstract void BuildDoor();
        public abstract void BuildWindows();

        public abstract House GetHouse();
    }

        //CreateHouse依赖与抽象,不依赖与具体
        public static House CreateHouse(Builder builder)
        {
            //比较稳定的
            builder.BuildDoor();
            builder.BuildDoor();

            builder.BuildWindows();
            builder.BuildWindows();

            return builder.GetHouse();

        }

    //变化的部分,一种Romain风格
    public  class RomainHouse:House
    {
        public RomainHouse()
        {
            Console.WriteLine("创建了Romain风格的房屋");
        }
    }

    public class RomainDoor : Door
    {
      
    }

    public class RomainWindows :Windows
    {

    }


    partial class RomainHouseBuilder:Builder
    {
        public override void BuildDoor()
        {
            Console.WriteLine("创建的Romain风格的门");
        }

        public override void BuildWindows()
        {
            Console.WriteLine("创建的Romain风格的窗");
        }


        public override House GetHouse()
        {
            return new RomainHouse();
        }
    }

    //变化的部分,一种Classic风格
    class ClassicHouse:House
    {

        public ClassicHouse()
        {
            Console.WriteLine("创建了Classic风格的房屋");
        }
    }

    public class ClassicDoor : Door
    {

    }

    public class ClassicWindows : Windows
    {

    }


    partial class ClassicHouseBuilder : Builder
    {
        public override void BuildDoor()
        {
            Console.WriteLine("创建的Classic风格的门");
        }

        public override void BuildWindows()
        {
            Console.WriteLine("创建的Classic风格的窗");
        }


        public override House GetHouse()
        {
            return new ClassicHouse();
        }
    }

    //客户程序
    class Test
    {
        static void Main(string[] args)
        {
            //Builder对象可以从配置文件中读取
            GameManager.CreateHouse(new RomainHouseBuilder());
            Console.WriteLine("********************************");
            GameManager.CreateHouse(new ClassicHouseBuilder());
        }
    }

posted @ 2008-11-30 15:49  百利  阅读(440)  评论(0编辑  收藏  举报