设计模式之原型模式

c#原型模式

1、定义

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需要任何创建的细节。

2、深复制和浅复制

1.深复制:把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象
2.被复制对象的所有对象都含有与原来对象相同的值,而所有的对其他对象的引用都任然指向原来的对象

3、实现原理

  1. UML类图
    这里写图片描述
    2.代码实现
 //抽象的原型类
   abstract class AProtoType
    {

        private string id;
        public AProtoType(string id)
        {
            this.id = id;
        }
        public string ID
        {
            get { return id; }
        }

        //Clone()方法,抽象的关键
        public abstract AProtoType Clone();
    }
  //具体的原型类
    class ConcreteProtoTypeA : AProtoType
    {
        public ConcreteProtoTypeA(string id) : base(id)
        {
        }

        public override AProtoType Clone()
        {
            //创建当前对象的浅表副本。方法是创建一个新对象,然后将当前对象的非静态字段复制到该新对象。
            //如果字段是值类型的,则对该字段执行逐位复制。如果字段是引用类型,则复制引用但不复制引用的对象;
            //因此原始对象及其副本引用同一个对象

            return (AProtoType)this.MemberwiseClone();
        }
    }

客户端:

  class Program
    {
        static void Main(string[] args)
        {
            ConcreteProtoTypeA ct = new ConcreteProtoTypeA("123");
            //克隆类ConcreteProtoTypeA的对象ct能得到新的实例copy
            ConcreteProtoTypeA copy =(ConcreteProtoTypeA) ct.Clone();
            Console.WriteLine("Cloned:{0}",copy.ID);
            Console.ReadKey();

        }
    }

输出:Cloned:123

4、实例

简历的原型实现:
4.1UML类图
这里写图片描述
4.2代码实现

 //简历类,实现可复制接口
    class PersonResume : ICloneable
    {
        private string name;
        private string sex;
        private string age;
        private string timeArea;
        private string company;
        public PersonResume(string name)
        {
            this.name = name;
        }
        //设置个人信息
        public void SetInfo(string sex,string age)
        {
            this.age = age;
            this.sex = sex;
        }
        //设置工作经历
        public void WorkExprience(string timearea,string company)
        {
            this.timeArea = timearea;
            this.company = company;
        }
        //显示
        public void Show()
        {
            Console.WriteLine("{0},{1},{2}",name,sex,age);
            Console.WriteLine("{0},{1}",timeArea,company);
        }
        //实现接口的方法,用来克隆对象
        public object Clone()
        {
            return (object)this.MemberwiseClone();
        }
    }

客户端:
class Program
{
static void Main(string[] args)
{
PersonResume pr = new PersonResume(“DZB”);
pr.SetInfo(“Man”,”18”);
pr.WorkExprience(“Three years”,”WKD”);

        PersonResume copy = (PersonResume)pr.Clone();
        copy.WorkExprience("Four Years","WKDCY");

        pr.Show();
        copy.Show();

        Console.ReadKey();


    }
}

输出:DZB Man 18 Three years WKD
DZB Man 18 Four years WKDCY

5、源代码

设计模式之原型模式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值