设计模式之原型模式

2014-11-23 23:41:34 · 作者: · 浏览: 0

原型模式是用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。简单说就是复制对象。

分为浅复制和深复制。

例如找工作时写多分简历。

浅复制实例:

    //简历类
    class resume : ICloneable {
        private string name;
        private string sex;
        private string age;

        //private string timeArea;
        //private string company;
        private WorkExperience work;
        public resume(string name){
            this.name = name;
            work = new WorkExperience();

        }

        //设置个人信息
        public void setPersonalInfo(string sex,string age) {
            this.age = age;
            this.sex = sex;
        }
        //设置工作经历
        public void setWorkExperience(string timeArea, string company)
        {
            work.WorkDate = timeArea;
            work.Company = company;
        }

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

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

            
    }
    //工作经历类
    class WorkExperience {
        private string workDate;
        public string WorkDate {
            get { return workDate; }
            set { workDate = value; }

        }

        private string company;
        public string Company {
            get { return company; }
            set { company = value; }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            resume a = new resume("大鸟");
            a.setPersonalInfo("男","29");
            a.setWorkExperience("1990-2000","XXX公司");

            resume b = (resume)a.Clone();
            b.setWorkExperience("1990-2000", "XYY公司");

            resume c = (resume)a.Clone();
            c.setPersonalInfo("男","24");

            a.Display();
            b.Display();
            c.Display();
            Console.ReadLine();
        }
    }

运行结果:可见浅复制并不能复制引用对象。

\

深复制实例:< http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PHByZSBjbGFzcz0="brush:java;"> //简历类 class resume : ICloneable { private string name; private string sex; private string age; //private string timeArea; //private string company; private WorkExperience work; public resume(string name){ this.name = name; work = new WorkExperience(); } private resume(WorkExperience work) { this.work = (WorkExperience)work.Clone(); } //设置个人信息 public void setPersonalInfo(string sex,string age) { this.age = age; this.sex = sex; } //设置工作经历 public void setWorkExperience(string timeArea, string company) { work.WorkDate = timeArea; work.Company = company; } //显示 public void Display() { Console.WriteLine("{0} {1} {2}",name ,sex,age ); Console.WriteLine("工作经历 : {0} {1}", work.WorkDate, work.Company); } public Object Clone() { resume obj = new resume(this.work); obj.name = this.name; obj.sex = this.sex; obj.age = this.age; return obj; // return (Object)this.MemberwiseClone(); } } //工作经历类 class WorkExperience:ICloneable { private string workDate; public string WorkDate { get { return workDate; } set { workDate = value; } } private string company; public string Company { get { return company; } set { company = value; } } public Object Clone() { return (Object )this.MemberwiseClone(); } } class Program { static void Main(string[] args) { resume a = new resume("大鸟"); a.setPersonalInfo("男","29"); a.setWorkExperience("1990-2000","XXX公司"); resume b = (resume)a.Clone(); b.setWorkExperience("1990-2000", "XYY公司"); resume c = (resume)a.Clone(); c.setPersonalInfo("男","24"); a.Display(); b.Display(); c.Display(); Console.ReadLine(); } }
运行结果: