设计模式:原型模式

今天来说说设计模式中的原型模式:

应用原型模式就是建立一个原型,然后通过对原型来进行复制的方法,来产生一个和原型相同或相似的新对象,或者说用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。如果我们需要大量的创建一个相同的对象的时候,可以采用原型模式。原型模式有浅拷贝和深拷贝。浅拷贝很简单下面我们来放上浅拷贝的代码

 public interface IColor
    {
        IColor clone();
        int Red { get; set; }
        int Green { get; set; }
        int Bule { get; set; }
    }

    public class RedColor : IColor
    {
        public int Red { get ; set; }
        public int Green { get; set; }
        public int Bule { get; set; }

        public IColor clone()
        {
            return (IColor)this.MemberwiseClone();
        }
    }

    public class Client
    {
        public void Test()
        {
            IColor color = new RedColor();
            color.Red = 255;
            Console.WriteLine("color red " + color.Red);
            IColor color1 = color.clone();
            color1.Red = 256;//值类型
            Console.WriteLine("color1 red " + color1.Red);
            Console.WriteLine("color red " + color.Red);
            Console.ReadKey();
        }
    }

因为是值类型,所以改变克隆后对象的属性不会影响到其本身。接下来说下利用序列化和反序列化实现深拷贝的原型模式。

关于深拷贝浅拷贝https://blog.csdn.net/heyangyi_19940703/article/details/51241081可以看看这篇文章。
 

public interface IColor
    {
        IColor clone();
        int Red { get; set; }
        int Green { get; set; }
        int Bule { get; set; }
        Test Test { get; set; }
    }
    [Serializable]
    public class RedColor : IColor
    {
        public int Red { get ; set; }
        public int Green { get; set; }
        public int Bule { get; set; }
        public Test Test { get; set; }

        public IColor clone()
        {
            SerializableHelp serializableHelp = new SerializableHelp();
            string target = serializableHelp.Serializeable(this);
            return serializableHelp.Derializable<IColor>(target);
        }

        //public IColor clone()
        //{
        //    return (IColor)this.MemberwiseClone();
        //}
    }
    [Serializable]
    public class Test
    {
        public string name { get; set; }
    }



    public class Client
    {
        public void Test()
        {
            IColor color = new RedColor();
            color.Red = 255;
            color.Test = new Test() { name = "Test1" };
            Console.WriteLine("color red " + color.Red);
            Console.WriteLine("color TestName " + color.Test.name);

            IColor color1 = color.clone();
            color1.Red = 256;//值类型
            color1.Test.name = "Test2";
            Console.WriteLine("color1 red " + color1.Red);
            Console.WriteLine("color1 TestName " + color1.Test.name);
            Console.WriteLine("color TestName " + color.Test.name);
            Console.ReadKey();
        }
    }

    public class SerializableHelp
    {
        public string Serializeable(object target)
        {
            using (MemoryStream stream = new MemoryStream())
            {
                new BinaryFormatter().Serialize(stream, target);
                return Convert.ToBase64String(stream.ToArray());
            }
        }

        public object Derializable(string target)
        {
            byte[] targetArray = Convert.FromBase64String(target);
            using (MemoryStream stream = new MemoryStream(targetArray))
            {
                return new BinaryFormatter().Deserialize(stream);
            }
        }

        public T Derializable<T>(string target)
        {
            return (T)Derializable(target);
        }
    }

以上就是通过序列化和反序列化实现的深拷贝。可以尝试把去掉注释的部分,再将上述的克隆方法去掉,比较下浅拷贝看看他们的输出有什么区别

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值