【學習貼】設計模式——原型模式

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章