1. 程式人生 > 其它 >yugabytedb架構之DocDB事務層

yugabytedb架構之DocDB事務層

編輯說明

回到首頁

概述

用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。

從一個物件再建立另外一個可定製的物件,而且不需要知道任何建立的細節。

淺複製

被複制物件的所有變數都含有與原來的物件相同的值,而所有的物件的引用仍然指向原來的物件

深複製

深複製則可以吧引用物件的變數指向複製過的新物件,而不是原有的被引用的物件

結構圖

程式碼實現

原型類

    /// <summary>
    /// 抽象原型類
    /// </summary>
    public abstract class Prototype
    {
        private string
id; // Constructor public Prototype(string id) { this.id = id; } // Property public string Id { get { return id; } } public abstract Prototype Clone(); }
    /// <summary>
    /// 具體原型類1
    /// </summary>
public class ConcretePrototype1 : Prototype { // Constructor public ConcretePrototype1(string id) : base(id) { } public override Prototype Clone() { // Shallow copy return (Prototype)this.MemberwiseClone(); } }
    /// <summary>
    /// 具體原型類2
    /// </summary>
    public class ConcretePrototype2 : Prototype
    {
        // Constructor 
        public ConcretePrototype2(string id)
            : base(id)
        {
        }
        public override Prototype Clone()
        {
            // Shallow copy 
            return (Prototype)this.MemberwiseClone();
        }
    }

客戶端

    class Program
    {
        static void Main(string[] args)
        {
            ConcretePrototype1 p1 = new ConcretePrototype1("I");
            ConcretePrototype1 c1 = (ConcretePrototype1)p1.Clone();
            Console.WriteLine("Cloned: {0}", c1.Id);

            ConcretePrototype2 p2 = new ConcretePrototype2("II");
            ConcretePrototype2 c2 = (ConcretePrototype2)p2.Clone();
            Console.WriteLine("Cloned: {0}", c2.Id);

            // Wait for user 
            Console.Read();
        }
    }

優勢

使用原型模式建立物件比直接new一個物件在效能上要好很多

使用深克隆方式儲存物件的狀態,使用原型模式將物件複製一份,並將其狀態儲存起來,簡化了建立物件的過程,以便在需要的時候使用

使用場景

1、資源優化場景。

2、類初始化需要消化非常多的資源,這個資源包括資料、硬體資源等。

3、效能和安全要求的場景。

4、通過 new 產生一個物件需要非常繁瑣的資料準備或訪問許可權,則可以使用原型模式。

5、一個物件多個修改者的場景。

6、一個物件需要提供給其他物件訪問,而且各個呼叫者可能都需要修改其值時,可以考慮使用原型模式拷貝多個物件供呼叫者使用。

7、在實際專案中,原型模式很少單獨出現,一般是和工廠方法模式一起出現,通過 clone 的方法建立一個物件,然後由工廠方法提供給呼叫者。

劣勢

配備克隆方法需要對類的功能進行通盤考慮,這對於全新的類不是很難,但對於已有的類不一定很容易,特別當一個類引用不支援序列化的間接物件,或者引用含有迴圈結構的時候

需要為每一個類都配置一個 clone 方法

Demo