设计模式之建造者模式

来源:互联网 发布:关于淘宝店流量知识 编辑:程序博客网 时间: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();            }        }    }

原创粉丝点击