1. 程式人生 > >趣味設計模式之原型模式

趣味設計模式之原型模式

    有一天,八戒問悟空,“大師兄,你怎麼可以拔一搓猴毛就可以生成無數個一摸一樣的你,怎麼那麼神奇?師兄既然是齊天大聖,我老豬有個問題向請教下,在程式設計的世界中,我怎麼可以實現呢?我想在下次的時候也玩一把,這樣我就可以躺著吃喝,不用幹活了,哈哈”

    “看你著呆子,平時喜歡偷閒,想不到問了偷懶還能想辦法,孺子可教也,讓師兄給你慢慢道來”

    原型模式,其實就是克隆一個物件,也是屬於建立型別的,比如一個物件需要載入很多的資源,如果直接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也是可以的。