原型模式

原型模式

一、定义

       原型模式(Prototype),用原型实例指定创建对象的种类,并且通过拷贝这些原则创建新的对象。

二、结构图

        原型模式其实就是从一个对象再创建另一个可定制的对象,而且不需要知道任何创建的细节。

三、原型模式的代码如下:

//原型类
    abstract class Prototype
    {
        private string id;

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

        public string ID
        {
            get { return id; }
        }

        public abstract Prototype Clone();//抽象类关键就是有这样一个Clone方法
    }

    //具体原型类
    class ConcretePrototype1 : Prototype
    {
        public ConcretePrototype1(string id)
            : base(id)
        { }
        public override Prototype Clone()
        {
            /*创建当前对象的浅表副本。方法是创建一个新对象,然后将当前对象的
             非静态字段复制到该新对象。如果字段是值类型的,则对该字段执行逐位
             复制。如果字段是引用类型,则复制引用但不复制引用的对象;因此,
             原始对象及其副本引用同一对象。
             */
            return (Prototype)this.MemberwiseClone();
        }
    }

 

 //客户端代码
        static void Main(string[] args)
        {
            ConcretePrototype1 p1 = new ConcretePrototype1("I");
            ConcretePrototype1 c1 = (ConcretePrototype1)p1.Clone();//克隆ConcretePrototype1的对象p1就能得到新的实例c1.
            Console.WriteLine("Cloned:{0}",c1.ID );

            Console.Read();
        }


        .NET在System命名空间中提供了ICloneable接口,其中唯一的一个方法Clone(),只要实现这个接口就可以完成原型模式了。

四、应用场景:

        一般在在初始化的信息不发生变化的情况下,克隆是最好的办法。这既隐藏了对象创建的细节,又对性能是大大的提高。

        优点:不用重新初始化对象,而是动态地获得对象运行时状态。

五、浅复制与深复制

        浅复制被复制的对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。

        深复制,深复制把引用的变量指向复制过的新对象,而不是原有的被引用的对象。

六、实例练习

       简历的原型实现 代码结构图:

 

 

 

   

上面三幅图的客户端代码 如果都是一样的,如下:

//客户端代码
        static void Main(string[] args)
        {
            Resume a = new Resume("***");
            a.SetPersonalInfo("男", "29");
            a.SetWorkExperience("1998-2000", "XX公司");

            Resume b = (Resume)a.Clone();
            b.SetWorkExperience("2001-2003", "YY企业");

            Resume c = (Resume)a.Clone();
            c.SetWorkExperience("2004-2006", "ZZ企业");

            a.Dispaly();
            b.Dispaly();
            c.Dispaly();

            Console.Read();
        }


则三幅图的显示结果分别为:

 

        总结:三幅代码结构图不同,客户端代码相同,执行结果不同,其原因:正好验证了原型模式,以及浅复制和深复制的知识。

        感受:在开始看书敲代码的时候,我并不理解深复制、浅复制,但随着我这篇博客的总结完事,我却明白了书上说的是什么,有了些感觉,很兴奋!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值