您的位置:首页 > 其它

【设计模式】——原型模式

2015-12-16 19:30 274 查看
设计模式:




定义:

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。其实就是从一个对象再创建另一个可定制的对象,而且不需知道任何创建的细节,通过该方法返回一个对象的副本通过工厂封装具体的
new操作的过程,返回一个新的对象)。即:复制。

结构图:




解释:

客户(Client)角色:克隆自身从而创建一个新的对象。

抽象原型(Prototype)角色:这是一个抽象角色,通常由一个C#接口或抽象类实现。此角色给出所有的具体原型类所需的接口。在C#中,抽象原型角色通常实现了ICloneable接口。

具体原型(Concrete Prototype)角色:被复制的对象。此角色需要实现抽象的原型角色所要求的接口。

优点:

1)使用原型模式创建对象比直接new一个对象在性能上要好的多,因为Object类的clone方法是一个本地方法,它直接操作内存中的二进制流,特别是复制大对象时,性能的差别非常明显。

2)简化对象的创建,使得创建对象就像我们在编辑文档时的复制粘贴一样简单。

3)不用初始化对象,而是动态的获得对象运行时的状态。

缺点:

每一个Prototype的子类都必须实现clone操作,这可能很困难。例如,当所考虑的类已经存在时就难以新增 clone操作。当内部包括一些不支持拷贝或有循环引用的对象时,实现克隆可能也会很困难的。



代码实现:

客户端:

static void Main(string[] args)
        {
            Resume a = new Resume("大鸟");
            a.SetPersonalInfo("男", "29");
            a.SetWorkExpriece("1999-2000", "好人公司");

            Resume b = (Resume)a.Clone();
            a.SetWorkExpriece("1999-2000", "好人公司");

            Resume c = (Resume)a.Clone();
            a.SetWorkExpriece("1999-2000", "好人公司");

            a.Display();
            b.Display ();
            c.Display();

            Console.Read();
        }


简历:

class Resume:ICloneable 
    {
        private string name;
        private string sex;
        private string age;
        private string timeArea;
        private string company;

        public Resume(string name)
        {
            this.name = name;
        }

        //设置个人信息
        public void SetPersonalInfo(string sex, string age)
        {
            this.sex = sex;
            this.age = age;
        }

        //设置工作经历
        public void SetWorkExpriece(string timeArea, string company)
        {
            this.timeArea = timeArea;
            this.company = company;
        }

        //显示
        public void Display()
        {
            Console.WriteLine("{0}{1}{2}",name,sex,age );
            Console.WriteLine("工作经历:{0}{1}",timeArea ,company );
        }

        public object Clone()
        {
            return (object)this.MemberwiseClone();
        }
    }


浅复制VS深复制:

MemberwiseClone()F方法:创建当前对象的浅表副本。创建一个新对象,将当前对象的非静态字段复制到该字段下。如果字段是值类型则对该字段执行逐位复制,如果是引用类型,则赋值引用而不复制引用的对象。,所以原始对象及其副本引用同一对象。
浅复制:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。

深复制:把所有引用对象的变量纸箱复制过的新对象,而不是原来的被引用的对象。

其实也就是浅复制是复制了地址,深复制是把地址和地址对应的内容都复制了过去。

推荐:《原型模式——创建型》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: