注意事項(xiàng):與通過對(duì)一個(gè)類進(jìn)行實(shí)例化來構(gòu)造新對(duì)象不同的是谨设,原型模式是通過拷貝一個(gè)現(xiàn)有對(duì)象生成新對(duì)象的氢惋。淺拷貝實(shí)現(xiàn) Cloneable,重寫烧颖,深拷貝是通過實(shí)現(xiàn) Serializable 讀取二進(jìn)制流。
1.簡(jiǎn)介
- 一般在初始化信息不變得情況下窄陡,克隆是最好得辦法炕淮。這既隱藏了對(duì)象創(chuàng)建得細(xì)節(jié),又對(duì)性能是大大得提高跳夭。
- 原型模式其實(shí)就是從一個(gè)對(duì)象再創(chuàng)建另一個(gè)可定制得對(duì)象涂圆,而且不需要知道任何創(chuàng)建得細(xì)節(jié)们镜。
2.場(chǎng)景
1、在寫簡(jiǎn)歷得時(shí)候名稱等一些信息不需要修改润歉,但是工作經(jīng)歷等需要修改模狭,重新初始化一個(gè)對(duì)象顯得非常低效和麻煩。
2踩衩、如果查詢一些數(shù)據(jù)得時(shí)候會(huì)很耗時(shí)嚼鹉,這時(shí)可以將查詢出來得對(duì)象作為原型,以后每次查詢都用這個(gè)對(duì)象得克隆對(duì)象作為返回信息驱富,這樣會(huì)提高效率锚赤。
3.優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
1、性能提高褐鸥。
2线脚、逃避構(gòu)造函數(shù)的約束。
缺點(diǎn):
1叫榕、配備克隆方法需要對(duì)類的功能進(jìn)行通盤考慮浑侥,這對(duì)于全新的類不是很難,但對(duì)于已有的類不一定很容易晰绎,特別當(dāng)一個(gè)類引用不支持串行化的間接對(duì)象寓落,或者引用含有循環(huán)結(jié)構(gòu)的時(shí)候。荞下。
2零如、必須實(shí)現(xiàn) Cloneable 接口。
4. 圖片模型
5. 代碼實(shí)現(xiàn)
1. 創(chuàng)建一個(gè)實(shí)現(xiàn)了 Cloneable 接口的抽象類
public abstract class Shape implements Cloneable {
private String id;
protected String type;
abstract void draw();
public String getType(){
return type;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public Object clone() {
Object clone = null;
try {
clone = super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return clone;
}
}
2. 創(chuàng)建擴(kuò)展了上面抽象類的實(shí)體類
public class Rectangle extends Shape {
public Rectangle(){
type = "Rectangle";
}
@Override
public void draw() {
System.out.println("Inside Rectangle::draw() method.");
}
}
public class Square extends Shape {
public Square(){
type = "Square";
}
@Override
public void draw() {
System.out.println("Inside Square::draw() method.");
}
}
public class Circle extends Shape {
public Circle(){
type = "Circle";
}
@Override
public void draw() {
System.out.println("Inside Circle::draw() method.");
}
}
3. 創(chuàng)建一個(gè)類锄弱,從數(shù)據(jù)庫獲取實(shí)體類,并把它們存儲(chǔ)在一個(gè) Hashtable 中
import java.util.Hashtable;
public class ShapeCache {
private static Hashtable<String, Shape> shapeMap
= new Hashtable<String, Shape>();
public static Shape getShape(String shapeId) {
Shape cachedShape = shapeMap.get(shapeId);
return (Shape) cachedShape.clone();
}
// 對(duì)每種形狀都運(yùn)行數(shù)據(jù)庫查詢祸憋,并創(chuàng)建該形狀
// shapeMap.put(shapeKey, shape);
// 例如会宪,我們要添加三種形狀
public static void loadCache() {
Circle circle = new Circle();
circle.setId("1");
shapeMap.put(circle.getId(),circle);
Square square = new Square();
square.setId("2");
shapeMap.put(square.getId(),square);
Rectangle rectangle = new Rectangle();
rectangle.setId("3");
shapeMap.put(rectangle.getId(),rectangle);
}
}
4. PrototypePatternDemo 使用 ShapeCache 類來獲取存儲(chǔ)在 Hashtable 中的形狀的克隆
public class PrototypePatternDemo {
public static void main(String[] args) {
ShapeCache.loadCache();
Shape clonedShape = (Shape) ShapeCache.getShape("1");
System.out.println("Shape : " + clonedShape.getType());
Shape clonedShape2 = (Shape) ShapeCache.getShape("2");
System.out.println("Shape : " + clonedShape2.getType());
Shape clonedShape3 = (Shape) ShapeCache.getShape("3");
System.out.println("Shape : " + clonedShape3.getType());
}
}