设计模式之建造者模式

/// <summary>
    /// 目的:学习建造者模型
    /// 日期:2013年11月20日
    /// 作者:秦元培
    /// 摘要:
    /// 下面描述的是建造者模式,建造者模式共有四种角色,分别是:
    /// 建造者角色、具体建造者角色、指导者角色、产品角色
    /// 建造者(Builder)角色:给出一个抽象接口,以规范产品对象的各个组成成分的建造。一般而言,此接口独立于应用程序的商业逻辑。模式中直接创建产品对象的是具体建造者(ConcreteBuilder)角色。具体建造者类必须实现这个接口所要求的方法:一个是建造方法,另一个是结果返还方法。
    /// 具体建造者(Concrete Builder)角色:担任这个角色的是于应用程序紧密相关的类,它们在应用程序调用下创建产品实例。这个角色主要完成的任务包括:实现Builder角色提供的接口,一步一步完成创建产品实例的过程。在建造过程完成后,提供产品的实例。
    /// 指导者(Director)角色:担任这个角色的类调用具体建造者角色以创建产品对象。导演者并没有产品类的具体知识,真正拥有产品类的具体知识的是具体建造者对象。
    /// 产品(Product)角色:产品便是建造中的复杂对象。
    /// 指导者角色是于客户端打交道的角色。导演者角色将客户端创建产品的请求划分为对各个零件的建造请求,再将这些请求委派给具体建造者角色。具体建造者角色是做具体建造工作的,但却不为客户端所知。
    /// A、以下情况应当使用建造者模式:
    /// 1、 需要生成的产品对象有复杂的内部结构。
    /// 2、 需要生成的产品对象的属性相互依赖,建造者模式可以强迫生成顺序。
    /// 3、 在对象创建过程中会使用到系统中的一些其它对象,这些对象在产品对象的创建过程中不易得到。
    /// B、使用建造者模式主要有以下效果:
    /// 1、 建造模式的使用使得产品的内部表象可以独立的变化。使用建造者模式可以使客户端不必知道产品内部组成的细节。
    /// 2、 每一个Builder都相对独立,而与其它的Builder无关。
    /// 3、 模式所建造的最终产品更易于控制。
    /// C、建造者模式的变种
    /// 1、如果系统中只有一个具体建造者,则可以省略抽象建造者;
    /// 2、在具体建造者只有一个的情况下,如果抽象建造者角色已经被省略掉,那么还可以省略掉指导者角色。让Builder角色自己扮演指导者与建造者双重角色。
    /// </summary>
    class BuilderPattern
    {
        /// <summary>
        /// 建造者角色类
        /// </summary>
         abstract class Builder
        {
             abstract public void BuildPartA();
             abstract public void BuildPartB();
             abstract public Product GetProduct();
        }

        /// <summary>
        /// 指导者角色
        /// </summary>
        class Director
        {
            public void Construct(Builder builder)
            {
                builder.BuildPartA();
                builder.BuildPartB();
            }
        }

        /// <summary>
        /// 具体建造者
        /// </summary>
        class ConcreteBuilder1:Builder
        {

            //私有字段product用于在内部完成产品的组装
            private Product product;
            public override void BuildPartA()
            {
                product = new Product();
                product.Add("PartA");
            }

            public override void BuildPartB()
            {
                product.Add("PartB");
            }

            public override Product GetProduct()
            {
                return product;
            }
        }

        /// <summary>
        /// 具体建造者
        /// </summary>
        class ConcreteBuilder2:Builder
        {
            //私有字段product用于在内部完成产品的组装
            private Product product;
            public override void BuildPartA()
            {
                product = new Product();
                product.Add("PartX");
            }

            public override void BuildPartB()
            {
                product.Add("PartY");
            }

            public override Product GetProduct()
            {
                return product;
            }
        }

        /// <summary>
        /// 产品角色类
        /// </summary>
        class Product
        {
            ArrayList List = new ArrayList();

            /// <summary>
            /// 产品类的Add方法,用以处理要组装的各个部分
            /// </summary>
            /// <param name="part">待组装的部分</param>
            public void Add(string part)
            {
                List.Add(part);
            }

            /// <summary>
            /// 显示产品具体信息的方法
            /// </summary>
            public void Show()
            {
                Console.WriteLine("下面显示该产品的各个部分信息");
                foreach (string part in List)
                {
                    Console.WriteLine("这是该产品的" + part + "部分");
                }
            }
        }

        /// <summary>
        /// 客户端类
        /// </summary>
        class Client
        {
            public void Main()
            {
                ///指导者
                Director director = new Director();
                //建造者
                Builder b1 = new ConcreteBuilder1();
                Builder b2 = new ConcreteBuilder2();

                //开始组装,b1将PartA与PartB组装成一个Product
                director.Construct(b1);
                //使用GetProduct方法返回创建好的产品
                Product product1 = b1.GetProduct();
                //显示产品信息
                product1.Show();

                //开始组装,b2将PartX与PartY组装成一个Product
                director.Construct(b2);
                //使用GetProduct方法返回创建好的产品
                Product product2 = b1.GetProduct();
                //显示产品信息
                product2.Show();
            }
        }
    }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云来雁去

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值