CSharp设计模式读书笔记(5):原型模式(学习难度:★★★☆☆,使用频率:★★★☆☆)...

本文详细介绍了原型模式的概念及其在C#中的实现方式。通过具体的代码示例展示了如何利用原型模式进行对象克隆,包括浅克隆与深克隆的区别。

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

模式角色与结构:

示例代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CSharp.DesignPattern.PrototypePattern
{
    class Program
    {
        static void Main(string[] args)
        {
            Prototype obj1 = new ConcretePrototypeA();
            obj1.Attr = "Sunny";

            Prototype obj2 = obj1.Clone();

            Prototype obj3 = new ConcretePrototypeB();
            obj3.Attr = "Dummy";

            Prototype obj4 = obj3.Clone();

            Console.ReadLine();
        }
    }

    interface Prototype
    {
        Prototype Clone();
        String Attr { get; set; }
    }

    class ConcretePrototypeA : Prototype
    {
        public Prototype Clone() //克隆方法
        {
            Prototype prototype = new ConcretePrototypeA(); // 创建新对象
            prototype.Attr = this.attr; // 这里是关键
            return prototype;
        }

        public String Attr
        {
            get { return attr; }
            set { attr = value; }
        }

        private String attr; //成员属性
    }

    class ConcretePrototypeB : Prototype
    {
        public Prototype Clone()
        {
            ConcretePrototypeB prototype = new ConcretePrototypeB();
            prototype.Attr = this.attr;
            return prototype;
        }

        public string Attr
        {
            get { return attr; }
            set { attr = value; }
        }

        private String attr;
    }
}

思考
能否将上述代码中的Clone()方法写成:public Prototype Clone() { return this; }?

浅克隆与深克隆
浅克隆中,如果原型对象的成员变量是值类型,将复制一份给克隆对象;如果原型对象的成员变量是引用类型,则将引用对象的地址复制一份给克隆对象,也就是说原型对象和克隆对象的成员变量指向相同的内存地址。简单来说,在浅克隆中,当对象被复制时只复制它本身和其中包含的值类型的成员变量,而引用类型的成员对象并没有复制
深克隆中,无论原型对象的成员变量是值类型还是引用类型,都将复制一份给克隆对象,深克隆将原型对象的所有引用对象也复制一份给克隆对象。简单来说,在深克隆中,除了对象本身被复制外,对象所包含的所有成员变量也将复制

 

转载于:https://www.cnblogs.com/thlzhf/archive/2012/11/28/2793132.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值