过眼•物影天狼

博客通天下 淡墨书豪辞

Flower

设计模式 — Builder

      上下文:一个产品有 n 个零件,通过构建产品的不同部分来生产不同的产品。

      解决方法:将一个产品的不同部件交由某个构建者的不同方法来实现,然后导演通过调用不同的方法,构建出不同的产品。

using System;

namespace Builder {
    /// <summary>
    /// 产品,其中包括两个部件
    /// </summary>
    public class Product {
        string part1 = string.Empty;
        string part2 = string.Empty;

        public string Part1 {
            get { return part1; }
            set {  part1 = value; }
        }

        public string Part2 {
            get { return part2; }
            set { part2 = value; }
        }
    }

    /// <summary>
    /// 构建者的接口标准
    /// </summary>
    public interface IBuilder {
        void BuildPart1();
        void BuildPart2();
        Product RetrieveProduct { get; }
    }

    /// <summary>
    /// 从接口派生出具体的构建者
    /// </summary>
    public class ConcreteBuilder:IBuilder {
        Product myProduct = new Product();

        #region IBuilder 成员
        public void BuildPart1() {
            // TODO:  添加 ConcreteBuilder.BuildPart1 实现
            myProduct.Part1 = "Part1 has been built!";
        }

        public void BuildPart2() {
            // TODO:  添加 ConcreteBuilder.BuildPart2 实现
            myProduct.Part2 = "Part2 has been built!";
        }

        public Product RetrieveProduct {
            get {
                // TODO:  添加 ConcreteBuilder.RetrieveProduct getter 实现
                return myProduct;
            }
        }
        #endregion
    }
 
    /// <summary>
    /// 导演通过调用具体构建者的不同构建方法,构建不同的部件,进而行成不同的产品
    /// 该导演生产了这样的三种产品
    /// 1、具有零件 1 和 2 的产品
    /// 2、只具有零件 1 的产品
    /// 3、只具有零件 2 的产品
    /// </summary>
    public class Director {
        Product product1, product2, product3;

        public Product Product1 {
            get { return product1; }
        }
        public Product Product2 {
            get { return product2; }
        }
        public Product Product3 {
            get { return product3; }
        }

        public Director() { }

        public void Construct() {
            ConcreteBuilder myCB1 = new ConcreteBuilder();
            myCB1.BuildPart1();
            myCB1.BuildPart2();
            product1 = myCB1.RetrieveProduct;

            ConcreteBuilder myCB2 = new ConcreteBuilder();
            myCB2.BuildPart1();
            product2 = myCB2.RetrieveProduct;

            ConcreteBuilder myCB3 = new ConcreteBuilder();
            myCB3.BuildPart2();
            product3 = myCB3.RetrieveProduct;
        }
    }

    /// <summary>
    /// 测试 Builder 模式
    /// </summary>
    class TestBuilder {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main(string[] args) {
            Director myDirector = new Director();
            myDirector.Construct();
            Console.WriteLine(myDirector.Product1.Part1);
            Console.WriteLine(myDirector.Product1.Part2);
            Console.WriteLine(myDirector.Product2.Part1);
            Console.WriteLine(myDirector.Product2.Part2);
            Console.WriteLine(myDirector.Product3.Part1);
            Console.WriteLine(myDirector.Product3.Part2);

            Console.Read();
        }
    }
}




Leave a Reply