C#编程模式之建造者模式

发布于:2024-04-25 ⋅ 阅读:(15) ⋅ 点赞:(0)

        模式介绍:各位伙伴,我们继续对编程模式进行深入浅出的探讨,本文主要介绍的模式是建造者模式。相对与工厂模式关注单一性质的产品而言,建造者模式更关注的是复杂产品的创建,尤其是产品各个部分的创建过程。建造者模式会根据各部分的不同来创建不同的产品。

        适用性介绍:工厂模式适用于创建单一性质的产品;建造者模式适用于创建复杂、由多个部分组成的对象。

        下面我们根据具体的例子来进行深入的理解。

        1、创建产品类。

    /// <summary>
    /// 被创建的产品类
    /// </summary>
    public class Product
    {
        /// <summary>
        /// 产品属性或说明的集合
        /// </summary>
        private List<string> listAttribute = new List<string>();

        /// <summary>
        /// 添加属性
        /// </summary>
        /// <param name="strAttribute">添加的属性值</param>
        public void AddAttribute(string strAttribute)
        {
            listAttribute.Add(strAttribute);
        }

        /// <summary>
        /// 显示所有属性
        /// </summary>
        /// <returns></returns>
        public string ShowAllAttribute()
        {
            string strResult = "我的属性值如下:";
            foreach (string strAttribute in listAttribute)
            {
                strResult += strAttribute + ",";
            }
            return strResult.TrimEnd(',');
        }
    }

        2、创建建造者基类。此类中定义包含赋值给产品所有属性的抽象方法,以及获取产品的抽象方法。

    /// <summary>
    /// 建造者基类
    /// </summary>
    public abstract class CBuilder
    {
        /// <summary>
        /// 建造属性1
        /// </summary>
        /// <returns></returns>
        public abstract void BuilderAttributeOne();
        /// <summary>
        /// 建造属性2
        /// </summary>
        /// <returns></returns>
        public abstract void BuilderAttributeTwo();
        /// <summary>
        /// 建造属性3
        /// </summary>
        /// <returns></returns>
        public abstract void BuilderAttributeThree();

        /// <summary>
        /// 建造产品
        /// </summary>
        /// <returns></returns>
        public abstract Product GetProduct();
    }

        3、创建具体的建造者类。建造者类用来实现基类,并定义具体的赋值和获取的过程。

    /// <summary>
    /// 具体的建造者A
    /// </summary>
    public class CSpecificBuilderA : CBuilder
    {
        private Product product = new Product();
        public override void BuilderAttributeOne()
        {
            product.AddAttribute("我是产品A");
        }

        public override void BuilderAttributeThree()
        {
            product.AddAttribute("生产我需要10分钟");
        }

        public override void BuilderAttributeTwo()
        {
            product.AddAttribute("每天生产我12个小时");
        }

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

    /// <summary>
    /// 具体的建造者B
    /// </summary>
    public class CSpecificBuilderB : CBuilder
    {
        private Product product = new Product();
        public override void BuilderAttributeOne()
        {
            product.AddAttribute("我是产品B");
        }

        public override void BuilderAttributeThree()
        {
            product.AddAttribute("生产我需要15分钟");
        }

        public override void BuilderAttributeTwo()
        {
            product.AddAttribute("每天生产我18个小时");
        }

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

        4、创建指挥者类。此类用来决定如何创建产品,不同的创建方法会产生不同的产品。

    /// <summary>
    /// 指挥者
    /// </summary>
    public class CDirector
    {
        /// <summary>
        /// 指挥创建产品的属性,此处可以随意增加或者修改是否添加相关属性
        /// </summary>
        /// <param name="builder"></param>
        public void ConstructMethodOne(CBuilder builder)
        {
            builder.BuilderAttributeOne();
            builder.BuilderAttributeTwo();
            builder.BuilderAttributeThree();
        }

        /// <summary>
        /// 指挥创建产品的属性,此处可以随意增加或者修改是否添加相关属性
        /// </summary>
        /// <param name="builder"></param>
        public void ConstructMethodTwo(CBuilder builder)
        {
            builder.BuilderAttributeOne();
            builder.BuilderAttributeThree();
        }
    }

        5、客户端调用。

    /// <summary>
    /// 建造者测试
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void btn_builder_Click(object sender, EventArgs e)
    {
        //创建一个指挥者
        CDirector director = new CDirector();
        //创建一个建造者基类
        CBuilder builder;
        //创建一个产品实例
        Product product;
        //建造者基类赋值为建造者A
        builder = new CSpecificBuilderA();
        //指挥创建builder的属性
        director.ConstructMethodOne(builder);
        //建造产品
        product = builder.GetProduct();

        tbox_builder.Text = product.ShowAllAttribute();

        //建造者基类赋值为建造者B
        builder = new CSpecificBuilderB();
        director.ConstructMethodTwo(builder);
        product = builder.GetProduct();

        tbox_builder.Text += "\r\n" + product.ShowAllAttribute();
    }

        至此,建造者模式的例程就基本完成,希望能给各位朋友带来一定的启发,也欢迎各位朋友批评指正。