设计模式(6)-原型模式

大家知道,程序员多数都是单身狗嘛。会时不时在闲暇的时候,在网上跟MM聊天,当追求一个妹纸的时候,经常要说些深情的话,收集了好多情话,需要的时候复制出来发给MM,这就是情话的原型了。

---------------------------------以上引自某个网上大牛对设计模式中原型模式的总结---------------------------------


原型模式在我理解,其实就是我们经常做的复制粘贴。但是每次都复制粘贴,代码看着太乱了,而且也不方便,所以就有了原型模式这种懒人模式了。它最重要的特点就是又一个原型类,然后有一个clone方法。结合我的理解,我大概写了一段代码,供大家理解。

原型类HoneyWord.cs

   public abstract class HoneyWord
    {
        private string name;
        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        public HoneyWord(string name)
        {
            this.name = name;
        }

        public void Output()
        {
            Console.WriteLine("{0}, 我对你的爱,犹如滔滔江水连绵不绝,又好像黄河决口,一发而不可收拾!", name);
        }

        public abstract HoneyWord Clone();
    }

然后还要有个具体实现的类ConcreteHoneyWord.cs

   public class ConcreteHoneyWord: HoneyWord
    {
        public ConcreteHoneyWord(string name):base(name)
        { }

        public override HoneyWord Clone()
        {
            return (HoneyWord)this.MemberwiseClone();
        }
    }

我们在客户端调用的时候,就可以这样了:

           ConcreteHoneyWord protoTypeHoneyWord = new ConcreteHoneyWord("小丽");
            ConcreteHoneyWord xiaoli = (ConcreteHoneyWord)protoTypeHoneyWord.Clone();
            xiaoli.Output();

            protoTypeHoneyWord = new ConcreteHoneyWord("小红");
            ConcreteHoneyWord xiaohong = (ConcreteHoneyWord)protoTypeHoneyWord.Clone();
            xiaohong.Output();

            Console.Read();


嗯 看来这个哥们还挺不专心的哈,和两个妹纸同时聊。大家不要学它。


注意上边代码中这句:

return (HoneyWord)this.MemberwiseClone();


这个被称之为浅克隆,也就是原型被复制的时候,只复制它本身和其中包含的值类型,而引用类型的成员并没有复制。

与之对应的还有深克隆,也就是复制的所有的内容。

深克隆的时候,需要把类标记为Serializable

然后可以使用如下的方法复制:

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

namespace HeadFirst
{
    public class SerializeHelper
    {
        /// <summary>
        /// 序列化
        /// </summary>
        /// <param name="target"></param>
        /// <returns></returns>
        public static string Serializable(object target)
        {
            using (MemoryStream stream = new MemoryStream())
            {
                new BinaryFormatter().Serialize(stream, target);
                return Convert.ToBase64String(stream.ToArray());
            }
        }
        /// <summary>
        /// 反序列化
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="target"></param>
        /// <returns></returns>
        public static T Derializable<T>(string target)
        {
            byte[] targetArray = Convert.FromBase64String(target);
            using (MemoryStream stream = new MemoryStream(targetArray))
            {
                return (T)(new BinaryFormatter().Deserialize(stream));
            }
        }
        /// <summary>
        /// 合并反序列化与序列化
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="t"></param>
        /// <returns></returns>
        public static T DeepClone<T>(T t)
        {
            return Derializable<T>(Serializable(t));
        }
    }
}

大家可以尝试一下。





知行办公,专业移动办公平台
 https://zx.naton.cn/
【总监】十二春秋之,3483099@qq.com;
【Master】zelo,616701261@qq.com;
【运营】运维艄公,897221533@qq.com;
【产品设计】流浪猫,364994559@qq.com;
【体验设计】兜兜,2435632247@qq.com;
【iOS】淘码小工,492395860@qq.com;iMcG33K,imcg33k@gmail.com;
【Android】人猿居士,1059604515@qq.com;思路的顿悟,1217022114@qq.com;
【java】首席工程师MR_W,feixue300@qq.com;
【测试】土镜问道,847071279@qq.com;
【数据】fox009521,42151960@qq.com;
【安全】保密,你懂的。 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值