设计模式- 原型模式

Gof定义

使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象。

动机

在软件系统中,经常面临着“某些结构复杂的对象”的创建工作,但由于需求的变化,这些对象将成面临着剧烈的变化,但他们拥有比较稳定一致的接口。

原型模式(Prototype)的几个要点

  • Prototype模式同样用于隔离类对象的使用者和具体类型(易变类型)之间的耦合关系,同样要求这些易变类型具有稳定的接口。
  • Prototype模式对于“如何创建易变类的实体对象”采用原型克隆的方法来做,他使得我们可以非常灵活的动态创建“拥有某些稳定接口”的新对象–所需工作仅仅是注册一个新类的对象(原型),然后在任何需要的地方不断地Clone。
  • Prototype模式中的克隆方法可以利用Net中的Object类的MemberwiseClone方法或是序列化来实现深拷贝。

最基本的实现代码 (通过this.MemberwiseClose来实现拷贝)

View Code
using System;
using System.Collections.Generic;
using System.Linq;<font color="#000000"></font>
using System.Text;

namespace 原型模式
{
    class Program
    {
        static void Main(string[] args)
        {
            ConcreteProtypeA p1 = new ConcreteProtypeA("Demo");
            ConcreteProtypeA p2 = (ConcreteProtypeA)p1.Clone();
            Console.WriteLine(p2.Id);
            Console.ReadLine();
        }
    }

    abstract class Prototype
    {
        private string id;
        public string Id
        {
            get { return id; }
            set { id = value; }
        }

        public Prototype(string id)
        {
            this.id = id;
        }

        public abstract Prototype Clone();
    }

    class ConcreteProtypeA : Prototype
    {
        public ConcreteProtypeA(string id)
            : base(id)
        { 
            
        }

        public override Prototype Clone()
        {
            return (Prototype)this.MemberwiseClone();
        }
    }

}

通过实现接口ICloneable来改进上面最基本的代码

View Code
namespace 原型模式
{
    class Program
    {
        static void Main(string[] args)
        {
            ConcreteProtypeA p1 = new ConcreteProtypeA("Demo");
            ConcreteProtypeA p2 = (ConcreteProtypeA)p1.Clone();
            Console.WriteLine(p2.Id);
            Console.ReadLine();
        }
    }


    class ConcreteProtypeA : ICloneable
    {

        private string id;
        public string Id
        {
            get { return id; }
            set { id = value; }
        }

        public ConcreteProtypeA(string id)
        {
            this.id = id;
        }

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

}

自己写的一个简单例子:

View Code
    class Program
    {
        static void Main(string[] args)
        {
            ConcreteProtypeA p1 = new ConcreteProtypeA();
            ConcreteProtypeA p2 = (ConcreteProtypeA)p1.Clone();
            Console.WriteLine(p2.name);
            p2.SayHello();

            Console.ReadLine();
        }
    }

    class ConcreteProtypeA : ICloneable
    {
        public string id = "1";
        public string name = "Jie";

        public void SayHello()
        {
            Console.WriteLine("Hi Jie");
        }

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

大话设计模式里拷贝简历的例子(浅层拷贝,深层暂时不作了解)

namespace 原型模式
{
    class Program
    {
        static void Main(string[] args)
        {
            Resume r = new Resume("大鸟");
            r.SetPersonInfo("", "29");
            r.SetWorkExperience("1909-2100", "微软公司");
            r.Display();

            Resume r2 = (Resume)r.Clone();
            r2.Display();
            r2.SetWorkExperience("2010-2011", "汕头公司");
            r2.Display();

            Console.ReadLine();
        }
    }

    class WorkExpreience
    {
        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 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 SetPersonInfo(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();
        }
    }
}

 

 

 

posted @ 2012-09-02 18:22  春天又来了  阅读(295)  评论(0编辑  收藏  举报