【原型模式】虽然叫做原型模式,但我感觉更适合叫克隆模式(想起来LOL~),因为这个设计模式完全是在讲如何实现克隆,或者用计算机术语来说是拷贝。
惯例,先贴代码。
public class DesignMode_CloneMode : MonoBehaviour {
private Cell mCellOne;
// Use this for initialization
void Start () {
mCellOne = new Cell();
mCellOne.mCellName = "细胞1号";
//细胞分裂出2号细胞
Cell mCellTwo = mCellOne.Clone() as Cell;
mCellTwo.mCellName = "细胞2号";
mCellTwo.Key.Clear();
mCellTwo.Key.Add(222);
//2号细胞又分裂出3号细胞
Cell mCellThree = mCellTwo.Clone() as Cell;
mCellThree.mCellName = "细胞3号";
print(mCellOne.mCellName+mCellOne.Key[0]);
print(mCellTwo.mCellName+mCellTwo.Key[0]);
print(mCellThree.mCellName + mCellThree.Key[0]);
mCellOne.Key.Clear();
mCellOne.Key.Add(221);
print(mCellTwo.mCellName + mCellTwo.Key[0]);
print(mCellThree.mCellName + mCellThree.Key[0]);
}
}
/// <summary>
/// 细胞类,继承自ICloneable接口
/// </summary>
public class Cell : ICloneable
{
/// <summary>
/// 细胞名字
/// </summary>
public string mCellName;
/// <summary>
/// 姑且叫做基因密码吧
/// </summary>
public List<int> Key = new List<int>();
public object Clone()
{
System.Object ob = null;
try
{
ob = MemberwiseClone();
}
catch (Exception)
{
Debug.LogError("异常");
}
return ob;
}
public Cell()
{
Key.Add(111);
}
}
首先呢,需要拷贝的类需要继承自ICloneable接口,在实现接口方法里通过调用MemberwiseClone()方法实现拷贝(我再网上看Java也有一个类似的接口)。原型模式呢主要是讲实例化的过程简化,个人感觉好像用的地方不是很多。
可以看到当改变细胞1号的key后,2号和3号的key也变成了“221”,这个也就是浅拷贝。可能大家会有疑问为什么要复杂的定义一个list类型的key而不是int或者string类型,因为list是引用类型,才能实现浅拷贝,而string,int的拷贝属于深拷贝。
我举个解释的深、浅拷贝的栗子:从电脑上复制游戏(从D盘拷到F盘吧),浅拷贝就是复制了游戏的快捷方式,深拷贝就是把游戏的所有东西都复制到F盘。这样的后果大家应该也都知道,复制了快捷方式,表面上,我们是复制了游戏,我们仍然可以点击快捷方式进入游戏,因为快捷方式是始终指向游戏的exe目录位置的,但如果游戏文件损坏了,这时候再点击快捷方式已经进不去游戏了。深拷贝那就是D、F盘都有一份游戏,都能通过各自的快捷方式进入游戏,两者中任意一个游戏文件损坏不会影响另一个。