一、定義
原型模式(Prototype Pattern)是用於創建重複的對象,同時又能保證性能。這種類型的設計模式屬於創建型模式,它提供了一種創建對象的最佳方式。這種模式是實現了一個原型接口,該接口用於創建當前對象的克隆。當直接創建對象的代價比較大時,則採用這種模式。例如,一個對象需要在一個高代價的數據庫操作之後被創建。我們可以緩存該對象,在下一個請求時返回它的克隆,在需要的時候更新數據庫,以此來減少數據庫調用。
二、設計類圖
三、優缺點分析
優點:提高性能、逃避構造函數的約束。
缺點:
1、配備克隆方法需要對類的功能進行通盤考慮,這對於全新的類不是很難,但對於已有的類不一定很容易,特別當一個類引用不支持串行化的間接對象,或者引用含有循環結構的時候。
2、已有的類沒有寫相應的clone方法,較爲麻煩,必須實現 Cloneable 接口。
四、代碼實現
形狀實現了Cloneable接口 實現了克隆方法:
public abstract class Shape implements Cloneable{
abstract void draw();
@Override
public Object clone(){
try {
return super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return null;
}
}
子類繼承並重寫draw()方法:
public class Circle extends Shape {
@Override
void draw() {
System.out.println("I am circle.");
}
}
public class ShapeCache {
//緩存對象
private static Hashtable<String, Shape> shapeCacheTable = new Hashtable<>();
//克隆
public static Shape getCacheShape(String id) {
return (Shape) shapeCacheTable.get(id).clone();
}
public static void loadCache() {
Circle circle = new Circle();
shapeCacheTable.put("1", circle);
}
}
驗證測試:
public class Main {
public static void main(String[] args) {
//加載緩存
ShapeCache.loadCache();
//從緩存中獲取對象並執行繪製的方法
Shape shape1 = ShapeCache.getCacheShape("1");
Shape shape2 = ShapeCache.getCacheShape("1");
//判斷兩個對象是否相等 輸出不等 說明並不是傳值引用 ,兩個對象有自己的地址
System.out.println(shape1 == shape2);
shape1.draw();
}
}