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

原型

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

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]刪除
最新教學 更多>
  • 為什麼Go不支持傳統繼承?
    為什麼Go不支持傳統繼承?
    Go中的繼承Go為什麼不支持傳統型別繼承? 傳統型別繼承,即子類別繼承一個或多個父類別的定義,不是 Go 程式語言的功能。 創建者的基本原理在Go 語言中FAQ,語言創建者解釋說,面向對象的程式語言通常強調定義類型之間的關係,這些關係在Go 中可以自動推論。 Go 類型不會明確指定類型關係,而是自動...
    程式設計 發佈於2024-11-08
  • 如何在 Python 中建立虛擬環境
    如何在 Python 中建立虛擬環境
    Python 虛擬環境對於管理依賴關係和避免專案之間的衝突至關重要。本指南將引導您完成在 Python 中建立和啟動虛擬環境的過程。 第 1 步:導航到您的專案目錄 開啟終端並導覽至要設定 Python 虛擬環境的目錄。您可以使用 cd 命令來執行此操作: cd /path/to/...
    程式設計 發佈於2024-11-08
  • 如何在 Go JSON 解組中處理巢狀數組?
    如何在 Go JSON 解組中處理巢狀數組?
    Golang JSON:透過解組處理嵌套數組在Go 中,解組後處理嵌套JSON 數組時,理解錯誤至關重要「類型介面{}不支援索引。」當您嘗試存取儲存在interface{}變數中的JSON陣列中的元素時,會發生此錯誤。 要解決此問題,您需要利用類型斷言將interface{}變數轉換為底層陣列類型。...
    程式設計 發佈於2024-11-08
  • 如何在 Java 中組合路徑
    如何在 Java 中組合路徑
    組合Java 中的路徑C#/.NET 中的System.IO.Path.Combine 方法允許將多個路徑段組合成一個單一、有效的路徑。 Java 提供了實作類似功能的替代方法。 Path Object在 Java 7 及更高版本中,建議使用 java.nio.file.Path 類別進行路徑操作。...
    程式設計 發佈於2024-11-08
  • 有效 JSON 有哪些不同的定義?
    有效 JSON 有哪些不同的定義?
    理解最小有效 JSONJSON 的概念已在各種 RFC 和規範中廣泛討論。 RFC4627 最初將 JSON 定義為序列化物件或陣列。根據此定義,僅 {}(空物件) 和 [](空數組) 符合有效、完整的 JSON 字串的條件。 但是,ECMA-404引入了一項修正案,擴大了有效 JSON 字串的範圍...
    程式設計 發佈於2024-11-08
  • 使用 MapStruct 來映射繼承層次結構
    使用 MapStruct 來映射繼承層次結構
    Intro MapStruct provides a rich set of features for mapping Java types. The technical documentation describes extensively the classes and ann...
    程式設計 發佈於2024-11-08
  • SQLite 參數替換是否會導致 Python 中的綁定錯誤?
    SQLite 參數替換是否會導致 Python 中的綁定錯誤?
    SQLite 參數替換問題在Python 2.5 中使用SQLite3 時,嘗試迭代列表並從中檢索資料時會出現一個常見問題一個資料時會出現一個常見問題一個資料庫.使用建議的「?」作為 SQL 注入預防措施的參數通常會導致有關綁定數量的錯誤。 經過調查,很明顯該錯誤源自於資料庫表的初始建立。建立語句,...
    程式設計 發佈於2024-11-08
  • 可以處理變數的 ID 以存取 Python 中的物件嗎?
    可以處理變數的 ID 以存取 Python 中的物件嗎?
    變數的 ID 可以取消引用嗎? 在 Python 中,id() 函數傳回物件的唯一識別碼。這個標識符可以儲存在變數中,但是這個變數的ID可以解引用嗎? 從學術角度來看,答案是肯定的。 _ctypes 模組提供了一個函數 PyObj_FromPtr(),可以將指標轉換為 Python 物件。使用此函數...
    程式設計 發佈於2024-11-08
  • 為什麼 imagecreatefrompng() 產生黑色背景而不是透明區域?
    為什麼 imagecreatefrompng() 產生黑色背景而不是透明區域?
    imagecreatefrompng() 產生黑色背景而不是透明區域? 在 PHP 中,imagecreatefrompng() 函數通常用於處理 PNG映像。然而,據觀察,使用此函數時,PNG 透明度可能會轉換為純黑色。 要解決此問題,可以在使用imagecreatetruecolor() 建立新...
    程式設計 發佈於2024-11-08
  • Go反射中reflect.Type和reflect.Value的主要差異是什麼?
    Go反射中reflect.Type和reflect.Value的主要差異是什麼?
    Go 中的反射類型和值Go 中的反射允許開發人員在運行時檢查和操作類型和值。了解它們的差異對於有效使用反射至關重要。 反射中的類型與值在反射中,reflect.TypeOf(i) 返回一個reflect.Type 對象,而reflect.ValueOf(i)返回一個reflect.Value obj...
    程式設計 發佈於2024-11-08
  • 如何在 AngularJS 中安全地設定變數的 iframe src 屬性?
    如何在 AngularJS 中安全地設定變數的 iframe src 屬性?
    在AngularJS 中從變數設定iframe src 屬性在AngularJS 中,嘗試從下列位置設定iframe 的src 屬性時可能會遭遇到問題一個變數。為了解決這個問題,這裡有一個逐步指南:1。注入 $sce 服務將 $sce(嚴格上下文轉義)服務注入控制器以處理清理。 function A...
    程式設計 發佈於2024-11-08
  • 為什麼我的 KeyListener 無法在 JPanel 中運作?
    為什麼我的 KeyListener 無法在 JPanel 中運作?
    JPanel 中KeyListeners 無回應:常見問題當使用KeyListeners 偵測JPanel 中的按鍵時,開發人員經常遇到這樣的問題:偵聽器無法觸發所需的操作。此問題可能由多個因素引起。 焦點元件約束KeyListener 依賴將自身附加到焦點元件才能正常運作。預設情況下,焦點不會自動...
    程式設計 發佈於2024-11-08
  • 從 React 到 React Native 的旅程
    從 React 到 React Native 的旅程
    作为一名 React / JS 开发人员,您可能有这样的想法 “我应该学习 React Native 吗?” 这是一个公平的问题,也是我几年前问自己的问题。事实证明,学习 React Native 绝对是正确的决定。这让我成为了亚马逊的高级开发倡导者,我现在使用 React Native 跨 And...
    程式設計 發佈於2024-11-08
  • 使用 Filament 和 Laravel 建立強大的管理面板:逐步指南
    使用 Filament 和 Laravel 建立強大的管理面板:逐步指南
    Laravel 是一个强大的 PHP 框架,为开发 Web 应用程序提供了坚实的基础。 Filament 是一个开源、优雅的 Laravel 管理面板和表单构建器,可简化管理界面的创建。本指南将引导您使用最新版本的 Filament 和 Laravel 构建强大的管理面板。 Laravel SaaS...
    程式設計 發佈於2024-11-08
  • 如何從 Pandas DataFrame 提取列標題?
    如何從 Pandas DataFrame 提取列標題?
    從 Pandas DataFrame 擷取列標題從 Pandas DataFrame 擷取列標題Pandas DataFrame 是通用的資料結構,可實現高效率的資料操作與分析。一項常見任務涉及提取列標題,這對於獲取 DataFrame 結構的概述或進一步處理非常有用。 假設您有一個從使用者輸入匯入...
    程式設計 發佈於2024-11-08

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

Copyright© 2022 湘ICP备2022001581号-3