趣味设计模式之原型模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/YQYnsmile/article/details/82985486

    有一天,八戒问悟空,“大师兄,你怎么可以拔一搓猴毛就可以生成无数个一摸一样的你,怎么那么神奇?师兄既然是齐天大圣,我老猪有个问题向请教下,在编程的世界中,我怎么可以实现呢?我想在下次的时候也玩一把,这样我就可以躺着吃喝,不用干活了,哈哈”

    “看你着呆子,平时喜欢偷闲,想不到问了偷懒还能想办法,孺子可教也,让师兄给你慢慢道来”

    原型模式,其实就是克隆一个对象,也是属于创建类型的,比如一个对象需要加载很多的资源,如果直接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也是可以的。

猜你喜欢

转载自blog.csdn.net/YQYnsmile/article/details/82985486