c#设计模式5——创建型模式_原型模式

浅克隆

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

namespace _1.创建者模式_原型模式//浅克隆
{
    //用一个已经创建的实例作为原型,通过对原型对象复制,产生一个和原型相同或相似的新对象。
    //关注的是大量相同或相似对象的创建问题。
    //1、抽象原型类(Prototype):声明一个具体对象必须实现的,克隆自身的接口,通常名为Clone();
    //2、具体原型类(Concrete Prototype):需要实现抽象原型类的Clone方法,包含深拷贝和浅拷贝。它是可被克隆的对象
    //浅克隆:克隆的新对象属性与原对象完全相同(非基本类型属性,也指向原对象指向的内存地址)
    //C#中的MemberwiseClone属于浅克隆。
    //深克隆:克隆的新对象属性与原对象完全相同(属性中引用的其他对象也会克隆,不再指向原有对象内存地址)
    //除了对象本身被复制外,对象所包含的所有成员变量也将被复制。
    //3、访问类:使用具体原型类的clone方法来复制新的对象。

    // 抽象原型类颜色接口
    public interface IColor
    {
        IColor Clone();

        int Red { get; set; }
        int Green { get; set; }
        int Blue { get; set; }
    }
    public class IdInfo
    {
        public string IdNumber;

        public IdInfo(string IdNumber)
        {
            this.IdNumber = IdNumber;
        }
    }
    //给出具体原型类
    public class Color : IColor
    {
        public int Red { get; set; }
        public int Green { get; set; }
        public int Blue { get; set; }
        //浅克隆方法
        public IColor Clone()
        {
            return (IColor)this.MemberwiseClone();
        }
    }
    class program
    { 
        static void Main(string[] args)
        {
            //实例化克隆
            IColor color = new Color();
            color.Red = 255;
            color.Green = 200;
            Console.WriteLine("color -red " + color.Red); //255
            Console.WriteLine("color -Green " + color.Green);//200

            IColor color1 = color.Clone();//再次克隆
            Console.WriteLine("color1-red " + color1.Red);//255
            Console.WriteLine("color -Green " + color1.Green);//200

            color.Red = 224;//赋值新克隆对象,改变属性,但不会改变原对象的属性
            Console.WriteLine("color -red " + color.Red); //224
            Console.WriteLine("color1-red " + color1.Red);//255

            Console.ReadKey();
        }
    }
    

深克隆

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;

namespace _1.创建者模式_原型模式_深克隆
{
 
    // 抽象原型类颜色接口
    public interface IColor
    {
         IColor DeepClone();

        int Red { get; set; }
        int Green { get; set; }
        int Blue { get; set; }
    }
    //给出具体原型类
[Serializable]
    public class Color : IColor
    {
        public int Red { get; set; }
        public int Green { get; set; }
        public int Blue { get; set; }
        //利用xml序列化和反序列化实现
        
        public virtual IColor DeepClone()
        {
            MemoryStream memoryStream = new MemoryStream();
            BinaryFormatter formatter = new BinaryFormatter();
            formatter.Serialize(memoryStream, this);
            memoryStream.Position = 0;
            return (IColor)formatter.Deserialize(memoryStream);
        }
    }
    class program
    {
        static void Main(string[] args)
        {
            //实例化克隆
            IColor color = new Color();
            color.Red = 255;
            Console.WriteLine("color -red " + color.Red); //255

            IColor color1 = color.DeepClone();//再次克隆
            Console.WriteLine("color1-red " + color1.Red);//255

            color.Red = 224;//赋值新克隆对象,改变属性,但不会改变原对象的属性
            Console.WriteLine("color -red " + color.Red); //224,对象副本的修改不会影响对象本身的状态

            IColor color2 = color1.DeepClone();//再次克隆
            Console.WriteLine("color1-red " + color2.Red);//224
            Console.ReadKey();
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值