創意設計模式之一。
用於建立給定物件的重複/淺副本。
當直接建立物件成本高昂時,此模式很有用,例如:如果在查詢大型資料庫後建立對象,則一次又一次地建立該物件在效能方面並不經濟。
因此,一旦創建了對象,我們就緩存該對象,並且在將來需要相同的對象時,我們從緩存中獲取它,而不是從數據庫中再次創建它,並在需要時更新數據庫以減少數據庫調用.
注意:我們必須使用 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 HashMapcache = 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]
要點
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3