创建型模式-建造者模式

using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;

namespace 建造者模式
{
    /*
     * 建造者模式意图:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
     * 
     * 建造者模式优点:1、建造者模式的使用使得产品内部表象可以独立的变化,使客户端不必知道产品内部组成细节。
     *                 2、每一个Builder都相对独立,而与其它的Builder无关。
     *                 3、可以使对构造过程更加精细控制,以降低控制细节的风险。
     *                 4、将构建代码和表示代码分开。
     *                 
     * 建造者模式缺点:1、由于其的变化点在于对象创建的细节,故其也难于分步骤构建的算法需求的变动,因为其关注的是对象创建顺序。
     * 
     * 建造模式实现要点:1、建造者模式主要用于“分步骤构建一个复杂的对象”,在这其中“分步骤”是一个稳定的算法,
     *                      而复杂对象的各个部分则经常变化
     *                   2、产品不需要抽象类,特别是由于创建对象的算法复杂而导致使用此模式的情况下或者此模式应用于产品的生成过程,
     *                      其最终结果可能差异很大,不大可能提炼出一个抽象产品类
     *                   3、创建者中的创建子部件的接口方法不是抽象方法而是空方法,不进行任何操作,具体的创建者只需要覆盖需要的方法就可以,
     *                      但是这也不是绝对的,特别是类似文本转换这种情况下,缺省的方法将输入原封不动的输出是合理的缺省操作
     *                   4、建造者模式常和组合模式(Composite Pattern)结合使用,其关注的的是对象“部分的变化”
     *                   
     * 建造者模式使用场景:1、当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。 
     *                     2、当构造过程必须允许被构造的对象有不同的表示时。 
     *                     3、相同的方法,不同的执行顺序,参数不同的事件结构,可以考虑建造者模式
     *                     4、当多个部件或零件,都可以装配到一个对象中,但产生的运行效果又不相同时
     *                     5、产品类非常复杂,或者产品类中的调用顺序不同参数了不同的效果
     *
     * 建造者模式产生效果:1、建造者模式的使用使得产品的内部表象可以独立的变化。使用建造者模式可以使客户端不必知道产品内部组成的细节。
     *                     2、将构建代码和表示代码分开。
     *                     
     * 建造者模式的变化扩展:可以省略掉抽象的buider
     * 
     */

    /// <summary>
    /// 需要组建的产品
    /// </summary>
    public class Product
    {
        private IList<string> parts=new List<string>();

        public void AddParts(string part)
        {
            parts.Add(part);
        }

        public void Show()
        {
            Console.WriteLine("产品开始创建......");
            foreach (string part in parts)
            {
                Console.WriteLine("部件" + part);
            }
            Console.WriteLine("产品完成创建");
        }
    }

    /// <summary>
    /// 抽象的建造模式,抽象组建产品必须的过程
    /// </summary>
    public abstract class Builder
    {
        /// <summary>
        /// 创建部件A的抽象
        /// </summary>
        public abstract void BuildPartA();
        /// <summary>
        /// 创建部件B的抽象
        /// </summary>
        public abstract void BuildPartB();

        /// <summary>
        /// 获取创建好的产品
        /// </summary>
        /// <returns></returns>
        public abstract Product GetProduct();
    }

    /// <summary>
    /// 具体的创建者1
    /// </summary>
    public class ConcreteBuider1 : Builder
    {
        private Product product = new Product();
        /// <summary>
        /// 创建具体部件A1
        /// </summary>
        public override void BuildPartA()
        {
            product.AddParts("A1");
        }
        /// <summary>
        /// 创建具体部件B1
        /// </summary>
        public override void BuildPartB()
        {
            product.AddParts("B1");
        }

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

    /// <summary>
    /// 产品而的创建
    /// </summary>
    public class ConcreteBuider2 : Builder
    {
        Product product = new Product();
        public override void BuildPartA()
        {
            product.AddParts("A2");
        }

        public override void BuildPartB()
        {
            product.AddParts("B2");
        }

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

    /// <summary>
    /// 建造指挥类,构建一个使用Builder接口的对象,即调用具体建造者角色以创建产品对象,但其并没有创建产品的具体实现。
    /// </summary>
    public class Director
    {
        public void Construct(Builder buider)
        {
            buider.BuildPartA();
            buider.BuildPartB();
        }
    }

    public class AppClient
    {
        public static void Main(string[] args)
        {
            Director diretor = new Director();
            Builder buider1 = new ConcreteBuider1();
            Builder buider2 = new ConcreteBuider2();

            //通过指挥类建造具体对象
            diretor.Construct(buider1);
            Product product1 = buider1.GetProduct();
            product1.Show();

            diretor.Construct(buider2);
            Product product2 = buider2.GetProduct();
            product2.Show();
            
        }
    }

   
}
posted @ 2011-03-04 22:57  日月之明  阅读(303)  评论(0编辑  收藏  举报