模式介绍:各位伙伴,我们继续对编程模式进行深入浅出的探讨,本文主要介绍的模式是建造者模式。相对与工厂模式关注单一性质的产品而言,建造者模式更关注的是复杂产品的创建,尤其是产品各个部分的创建过程。建造者模式会根据各部分的不同来创建不同的产品。
适用性介绍:工厂模式适用于创建单一性质的产品;建造者模式适用于创建复杂、由多个部分组成的对象。
下面我们根据具体的例子来进行深入的理解。
1、创建产品类。
- ///
- /// 被创建的产品类
- ///
- public class Product
- {
- ///
- /// 产品属性或说明的集合
- ///
- private List<string> listAttribute = new List<string>();
-
- ///
- /// 添加属性
- ///
- /// 添加的属性值
- public void AddAttribute(string strAttribute)
- {
- listAttribute.Add(strAttribute);
- }
-
- ///
- /// 显示所有属性
- ///
- ///
- public string ShowAllAttribute()
- {
- string strResult = "我的属性值如下:";
- foreach (string strAttribute in listAttribute)
- {
- strResult += strAttribute + ",";
- }
- return strResult.TrimEnd(',');
- }
- }
2、创建建造者基类。此类中定义包含赋值给产品所有属性的抽象方法,以及获取产品的抽象方法。
- ///
- /// 建造者基类
- ///
- public abstract class CBuilder
- {
- ///
- /// 建造属性1
- ///
- ///
- public abstract void BuilderAttributeOne();
- ///
- /// 建造属性2
- ///
- ///
- public abstract void BuilderAttributeTwo();
- ///
- /// 建造属性3
- ///
- ///
- public abstract void BuilderAttributeThree();
-
- ///
- /// 建造产品
- ///
- ///
- public abstract Product GetProduct();
- }
3、创建具体的建造者类。建造者类用来实现基类,并定义具体的赋值和获取的过程。
- ///
- /// 具体的建造者A
- ///
- 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;
- }
- }
-
- ///
- /// 具体的建造者B
- ///
- 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、创建指挥者类。此类用来决定如何创建产品,不同的创建方法会产生不同的产品。
- ///
- /// 指挥者
- ///
- public class CDirector
- {
- ///
- /// 指挥创建产品的属性,此处可以随意增加或者修改是否添加相关属性
- ///
- ///
- public void ConstructMethodOne(CBuilder builder)
- {
- builder.BuilderAttributeOne();
- builder.BuilderAttributeTwo();
- builder.BuilderAttributeThree();
- }
-
- ///
- /// 指挥创建产品的属性,此处可以随意增加或者修改是否添加相关属性
- ///
- ///
- public void ConstructMethodTwo(CBuilder builder)
- {
- builder.BuilderAttributeOne();
- builder.BuilderAttributeThree();
- }
- }
5、客户端调用。
- ///
- /// 建造者测试
- ///
- ///
- ///
- 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();
- }
至此,建造者模式的例程就基本完成,希望能给各位朋友带来一定的启发,也欢迎各位朋友批评指正。