」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 原型

原型

發佈於2024-11-08
瀏覽:157

Prototype

創意設計模式之一。
用於建立給定物件的重複/淺副本。
當直接建立物件成本高昂時,此模式很有用,例如:如果在查詢大型資料庫後建立對象,則一次又一次地建立該物件在效能方面並不經濟。
因此,一旦創建了對象,我們就緩存該對象,並且在將來需要相同的對象時,我們從緩存中獲取它,而不是從數據庫中再次創建它,並在需要時更新數據庫以減少數據庫調用.

注意:我們必須使用 Cloneable,即需要克隆的物件的標記接口,它(Clonable)不包含任何方法,它表明一個類別可以被克隆,這意味著創建一個類別的副本目的。

Object.clone() 方法 預設建立淺拷貝
預設情況下,clone() 方法執行物件的淺表複製。這意味著它創建一個新物件並將所有欄位從原始物件複製到新物件。但是,如果該物件包含對其他物件(例如陣列、列表或自訂物件)的引用,則複製引用本身,而不是它們指向的實際物件。
因此,原始物件和克隆物件都將引用這些欄位的相同物件。透過一個實例對引用物件所做的任何變更都會反映在另一個實例中。

讓我們透過一個可以複製的 Shape 物件的範例來理解這一點。

形狀

public class Shape implements Cloneable {
    private String id;
    protected String shape;

    @Override
    public String toString() {
        return "Shape [id="   id   ", shape="   shape   "]";
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getShape() {
        return shape;
    }

    @Override
    public Object clone(){
        Object clone = null;
        try {
            clone = super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return clone;
    }
}

兒童班

public class Rectangle extends Shape {

    public Rectangle(){
        shape = "Rectangle";
    }
    public void draw(){
       System.out.println("calling draw() of Rectangle shape");
    }
}

public class Circle extends Shape {
    public Circle(){
        shape = "Circle";
    }
    public void draw(){
        System.out.println("Calling draw in Circle method");
    }
}

快取

public class ShapeCache {
    public static HashMap cache = new HashMap();

    public static Shape cloneObject(String id){
        return (Shape)cache.get(id);
    }
    public static void addShapeInCache(Shape shape){
        cache.put(shape.getId(),shape);
    }

}

主要的

public class Main {
    public static void main(String args[]){
        Shape circle = new Circle();
        circle.setId("1");
        Shape rectangle = new Rectangle();
        rectangle.setId("2");

        ShapeCache.addShapeInCache(rectangle);
        ShapeCache.addShapeInCache(circle);

        Shape copyShape1 = (Shape) ShapeCache.cache.get(circle.getId());
        Shape copyShape2 =(Shape) ShapeCache.cache.get(rectangle.getId());

        System.out.println(copyShape1);
        System.out.println(copyShape2);
    }

}

輸出:

Shape [id=1, shape=Circle]
Shape [id=2, shape=Rectangle]

要點

  • 圓形和矩形都遵循里氏替換原則(SOLID原則),該原則規定物件應該可以用它們的子類型替換,而不影響代碼的正確性
  • 僅建立 Shape 物件的淺表副本。
版本聲明 本文轉載於:https://dev.to/prashantrmishra/prototype-15hn?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3