现在的位置: 首页 > 综合 > 正文

设计模式学习笔记(六)——Prototype原型模式

2012年09月19日 ⁄ 综合 ⁄ 共 3643字 ⁄ 字号 评论关闭

       Prototype原型模式是一种创建型设计模式,它主要面对的问题是:“某些结构复杂的对象”的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是他们却拥有比较稳定一致的接口。感觉好像和前几篇所说的设计模式有点分不清,下面我们先来回顾一下以前的几种设计模式,予以区分,再来说说原型模式。

       Singleton单件模式解决的问题是:实体对象个数问题(这个现在还不太容易混)

       AbstractFactory抽象工厂模式解决的问题是:“一系列互相依赖的对象”的创建工作

       Builder生成器模式解决的问题是:“一些复杂对象”的创建工作,子对象变化较频繁,对算法相对稳定

      FactoryMethor工厂方法模式解决的问题是:某个对象的创建工作

      再回来看看今天的Prototype原型模式,它是用来解决“某些结构复杂的对象”的创建工作。现在看看,好象还是差不多。这个问题先放在这,我们先往下看Prototype原型模式。

      《设计模式》中说道:使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象。

      此时注意:原型模式是通过拷贝自身来创建新的对象,这一点和其他创建型模式不相同。好,我们再来看看原型模式的结构



      
这个结构说明原型模式的客户端程序(ClientApp)是依赖于抽象(Prototype),而对象的具体实现也是依赖于抽象(Prototype)。符合设计模式原则中的依赖倒置原则——抽象不应依赖于具体实现,具体实现应依赖于抽象。

       我们现在回来看看原型模式的实现,我定义了一个场景,一个人开这一辆车在一条公路上。现在这件事是确定的,但不确定的有几点:1、人:姓名,性别,年龄;2车:什么牌子的;3公路:公路名字,长度,类型(柏油还是土路)。现在我们一个个实现。

       先来实现人,定义一个抽象类,AbstractDriver,具体实现男性(Man)和女性(Women

public abstract class AbstractDriver

    {

        public AbstractDriver()

        {

            //

            // TODO: 在此处添加构造函数逻辑

            //

        }

 

        public string name;

        public string sex;

        public int age;

 

        public abstract string drive();

 

        public abstract AbstractDriver Clone();

    }

 

    public class Man:AbstractDriver

    {

        public Man(string strName,int intAge)

        {

            sex = "Male";

            name = strName;

            age = intAge;

        }

 

        public override string drive()

        {

            return name + " is drive";

        }

 

        public override AbstractDriver Clone()

        {

            return (AbstractDriver)this.MemberwiseClone();

        }

    }

 

    public class Women:AbstractDriver

    {

        public Women(string strName,int intAge)

        {

            sex = "Female";

            name = strName;

            age = intAge;

        }

 

        public override string drive()

        {

            return name + " is drive";

        }

 

        public override AbstractDriver Clone()

        {

            return (AbstractDriver)this.MemberwiseClone();

        }

    }

    注意:抽象代码中有一个Clone的方法,个人认为这个方法是原型模式的一个基础,因为前面讲了原型模式是通过拷贝自身来创建新的对象。

      下面我们再来实现公路和汽车

      公路:

public abstract class AbstractRoad

    {

        public AbstractRoad()

        {

            //

            // TODO: 在此处添加构造函数逻辑

            //

        }

 

        public string Type;

        public string RoadName;

        public int RoadLong;

 

        public abstract AbstractRoad Clone();

    }

 

    public class Bituminous:AbstractRoad    //柏油路

    {

        public Bituminous(string strName,int intLong)

        {

            RoadName = strName;

            RoadLong = intLong;

            Type = "Bituminous";

        }

 

        public override AbstractRoad Clone()

        {

            return (AbstractRoad)this.MemberwiseClone();

        }

    }

 

    public class Cement:AbstractRoad        //水泥路

    {

        public Cement(string strName,int intLong)

        {

            RoadName = strName;

            RoadLong = intLong;

            Type = "Cement";

        }

 

        public override AbstractRoad Clone()

        {

            return (AbstractRoad)this.MemberwiseClone();

        }

    }

   

    汽车:

    public abstract class AbstractCar

    {

        public AbstractCar()

        {

            //

            // TODO: 在此处添加构造函数逻辑

            //

        }

 

        public string OilBox;

        public string Wheel;

        public string Body;

 

        public abstract string Run();

        public abstract string Stop();

 

        public abstract AbstractCar Clone();

    }

 

    public class BMWCar:AbstractCar

    {

        public BMWCar()

        {

            OilBox = "BMW's OilBox";

            Wheel = "BMW's Wheel";

            Body = "BMW's body";

        }

 

        public override string Run()

        {

            return "BMW is running";

        }

 

        public override string Stop()

        {

            return "BMW is stoped";

        }

 

        public override AbstractCar Clone()

        {

            return (AbstractCar)this.MemberwiseClone();

        }

    }

 

    public class BORACar:AbstractCar

    {

抱歉!评论已关闭.