当前位置:编程学习 > C#/ASP.NET >>

设计模式——原型模式

原型模式
        为了解决类似于从一个对象再创建另外一个可定制的对象,而不需要知道任何创建的细节问题,产生了原型模式。用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。
 
结构图
 
基本原型模式的实现代码  
<span style="font-size:18px;">namespace 原型模式  
{  
    class Program  
    {  
        static void Main(string[] args)  
        {  
              
  
            ConcretePrototype1 p1 = new ConcretePrototype1("I");  
  
            //克隆类ConcretePrototype1的对象p1就能得到新的实例c1  
            ConcretePrototype1 c1 = (ConcretePrototype1)p1.Clone();  
            Console.WriteLine("Cloned:{0}", c1.Id);  
  
            Console.Read();  
        }  
    }  
  
      
    //原型类  
    abstract class Prototype   
    {  
        private string id;  
        public Prototype(string id)  
        {  
            this.id = id;  
        }  
        public string Id  
        {  
            get { return id; }  
        }  
  
        //在抽象类中声明一个克隆的方法  
        public abstract Prototype Clone();  
    }  
  
      
    //具体原型类  
    class ConcretePrototype1 : Prototype   
    {  
        public ConcretePrototype1(string id)  
            : base(id)  
        { }  
  
        public override Prototype Clone()  
        {  
            //创建当前对象的浅副表本  
            return (Prototype)this.MemberwiseClone();  
        }  
  
    }  
  
     
}</span>  
 
        MemberwiseClone()方法是创建一个新对象,然后将当前对象的非静态字段复制到该新对象。如果字段是值类型的,则对该字段执行逐位复制。如果字段是引用类型,则复制引用但不复制引用的对象;因此,原始对象及其副本引用同一对象。
 
        对于.Net而言,那个原型抽象类Prototype是用不着的,因为克隆是在是太常用了,所以.Net在System命名空间中提供了ICloneable接口,其中就是唯一的一个方法Clone(),这样只需要实现这个接口就可以完成原型模式了。
 
例子
例如,复制一份简历,简历的原型实现
实现
[csharp] 
<span style="font-size:18px;">//简历类  
    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 SetWorkExperience(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();  
        }  
    }</span>  
 
       一般在初始化的信息不发生变化的情况下,克隆是最好的办法,这既隐藏了对象创建的细节,又大大的提高了性能。等于是不用重新初始化对象,而是动态地获得对象运行时的状态。
 
浅复制
      被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。也就是说,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。
 
我们先来看一个例子,简历复制。
结构图
 
代码实现
 
工作经历类
[csharp]  
<span style="font-size:18px;"> //工作经历  
    class WorkExperience  
    {  
        private string workDate;  
        public string WorkDate  
        {  
            get { return workDate; }  
            set { workDate = value; }  
        }  
补充:软件开发 , C# ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,