大家知道,程序员多数都是单身狗嘛。会时不时在闲暇的时候,在网上跟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;
【安全】保密,你懂的。