【原型模式】雖然叫做原型模式,但我感覺更適合叫克隆模式(想起來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盤都有一份遊戲,都能通過各自的快捷方式進入遊戲,兩者中任意一個遊戲文件損壞不會影響另一個。