趣味設計模式之原型模式
阿新 • • 發佈:2018-11-23
有一天,八戒問悟空,“大師兄,你怎麼可以拔一搓猴毛就可以生成無數個一摸一樣的你,怎麼那麼神奇?師兄既然是齊天大聖,我老豬有個問題向請教下,在程式設計的世界中,我怎麼可以實現呢?我想在下次的時候也玩一把,這樣我就可以躺著吃喝,不用幹活了,哈哈”
“看你著呆子,平時喜歡偷閒,想不到問了偷懶還能想辦法,孺子可教也,讓師兄給你慢慢道來”
原型模式,其實就是克隆一個物件,也是屬於建立型別的,比如一個物件需要載入很多的資源,如果直接new的話,可能會關聯很多的物件,這樣是不是很麻煩?耗效能一點?那麼有沒有一種方式呢?答案就是原型模式,下面一起看下:
(1)第一步,建立一個抽象類(或者普通類也可以),實現Cloneable介面,實現clone方法
public abstract class WUKONG implements Cloneable{ private String id; protected String who; protected abstract void show(); public String getId() { return id; } public void setId(String id) { this.id = id; } public String getWho() { return who; } public void setWho(String who) { this.who = who; } public Object clone() throws CloneNotSupportedException { Object clone = null; clone = super.clone(); return clone; } }
(2)第二步,建立子類(為了方便觀察)
public class WUKONG1 extends WUKONG{
public WUKONG1() {
this.who = "I am WUKONG1";
}
@Override
protected void show() {
System.out.println(this.who);
}
}
public class WUKONG2 extends WUKONG{ public WUKONG2() { this.who = "I am WUKONG2"; } @Override protected void show() { System.out.println(this.who); } }
(3)第三步,中間站,生產物件的地方
public class CloneFactory {
private static Map<String,WUKONG> map = new HashMap<>();
public static WUKONG getWUKONG(String id) throws CloneNotSupportedException {
WUKONG clone = (WUKONG) map.get(id).clone();
return clone;
}
public static void loadWukong() {
WUKONG1 w1 = new WUKONG1();
w1.setId("1");
map.put(w1.getId(), w1);
WUKONG2 w2 = new WUKONG2();
w1.setId("2");
map.put(w1.getId(), w2);
}
}
(4)測試效果
public class Test {
public static void main(String[] args) throws CloneNotSupportedException {
CloneFactory.loadWukong();
WUKONG w = CloneFactory.getWUKONG("1");
w.show();
WUKONG w1 = CloneFactory.getWUKONG("2");
w1.show();
}
}
(5)效果
其實大部分的時候我們直接用一個集合類來儲存,我們需要用到的時候再用就可以了,直接clone也是可以的。