设计模式之建造者模式
来源:互联网 发布:关于淘宝店流量知识 编辑:程序博客网 时间:2024/05/17 03:35
/// <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(); } } }