有一天,八戒问悟空,“大师兄,你怎么可以拔一搓猴毛就可以生成无数个一摸一样的你,怎么那么神奇?师兄既然是齐天大圣,我老猪有个问题向请教下,在编程的世界中,我怎么可以实现呢?我想在下次的时候也玩一把,这样我就可以躺着吃喝,不用干活了,哈哈”
“看你着呆子,平时喜欢偷闲,想不到问了偷懒还能想办法,孺子可教也,让师兄给你慢慢道来”
原型模式,其实就是克隆一个对象,也是属于创建类型的,比如一个对象需要加载很多的资源,如果直接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也是可以的。