DesignPattern - Basic - Prototype

Tue, Aug 7, 2018 閱讀時間 1 分鐘

Prototype

一種對象創建機制。

假設有一個從 DB 加載數據的對象。現在,我們需要在程序中多次修改這些數據。因此,使用 new 關鍵字創建對象並再次從數據庫中加載所有數據並不是一個好主意。因此,更好的方法是將現有對象 clone 為新對象,然後進行數據操作。

但是,原型設計模式要求您正在復制的對象應提供複製功能。顯然,它不應該由任何其他類來完成。但是,是使用 Object 屬性的淺拷貝還是深拷貝取決於需求,這是一個設計決定。

例如,讓我們看看這有什麼用處。如果創建原始對象時使用的資源(例如數據流)在需要對象克隆時可能不可用。另一個例子是,如果原始對象創建涉及大量時間投入,例如從數據庫或通過網絡讀取數據。

object clone 利用 clone() 方法和 implements Cloneable interface。默認情況下,clone() 執行淺拷貝。此外,Serializable 可用於簡化深度複製。 BTW, 可以實現自己的原型模式。為此,創建一個具有 doClone () 方法的 Prototype 接口。


    public class Pc implements Cloneable {

        private String keyboard;
        private String mouse;
        private String screen;

        public Pc() {
            keyboard = "機械";
            mouse = "羅技";
            screen = "Dell";
        }

        public Pc clone(){
            return new Pc();
        }

        public void makeAmericaStyle(){
            keyboard = "Magic Keyboard";
            mouse = "Apple Mouse";
            screen = "Apple Screen";
        }

        public String getMouse(){
            return mouse;
        }
    }

    public class PrototypeTest {

       public Bike getUSAPc(Pc basicPc){
          pc.makeAmericaStyle();
          return basicBike;
       }

       public static void main(String[] args) {

          Pc pc = new Pc();
          Pc basicPc = pc.clone();

          PrototypeTest prototype = new PrototypeTest();
          Pc americaPc = prototype.getUSAPc(basicPc);

          System.out.println("overwrite method " + americaPc.getMouse());
          System.out.println("all attribute" + americaPc.toString());
       }
    }
  • 當在運行時指定要實例化的類時,例如,通過動態加載
  • 避免建立與產品類層次結構平行的工廠類層次結構
  • 當類的實例可以具有僅有的幾種不同狀態組合之一時。但是,安裝相應數量的原型並克隆它們可能更方便,而不是每次使用適當的狀態手動實例化類。