【原型模式】虽然叫做原型模式,但我感觉更适合叫克隆模式(想起来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盘都有一份游戏,都能通过各自的快捷方式进入游戏,两者中任意一个游戏文件损坏不会影响另一个。