创建型-原型(Prototype)
2020-09-16 本文已影响0人
DoneWillianm
原型(Prototype)
[TOC]
定义
Specify the kinds of objects to create using a prototypical instance,and create new objects bycopying this prototype.(用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。)
原型模式在Java中的应用其实就是clone接口的使用,该模式的要点在于思考拷贝的特点和应用以及深/浅拷贝的知识点
简单场景使用
惯例,英雄联盟克隆大作战,所有玩家使用同一个英雄,我们作为游戏开发者,如果用户每每选定的同一个英雄在实际创建的时候,都去new,那么每次都会经过对象的构造过程,一些初始化赋值的操作等等,那么这个时候其实我们可以仅new一次英雄对象,在提供给玩家的时候就直接clone,省去构造的过程,对性能有所提升,同时又不会影响到别的玩家使用同样的英雄
coding
英雄对象,简单在构造中打印一下
public class Hero implements Cloneable{
private String name;
public String type;
public Hero(String name, String type) {
this.name = name;
this.type = type;
System.out.println(String.format("构造英雄 name:%s, type:%s", name, type));
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
@Override
protected Hero clone() {
Hero hero = null;
try {
hero = (Hero) super.clone();
} catch (Exception e) {
e.printStackTrace();
}
return hero;
}
@Override
public String toString() {
return "Hero{" +
"name='" + name + '\'' +
", type='" + type + '\'' +
'}';
}
}
静态工厂产生英雄
public class HeroFactory {
public static Hero hero = new Hero("ez", "ad");
public static Hero createEz() {
return hero.clone();
}
public static Hero createAxy() {
Hero hero = HeroFactory.hero.clone();
hero.setName("Axy");
return hero;
}
}
最后直接运行
public static void main(String[] args) {
Hero ez = HeroFactory.createEz();
Hero axy = HeroFactory.createAxy();
System.out.println("ez: " + ez.toString());
System.out.println("axy:" + axy);
}
// 构造英雄 name:ez, type:ad
// ez: Hero{name='ez', type='ad'}
// axy:Hero{name='Axy', type='ad'}
可以看到打印结果构造仅执行了一次,在构造艾希的时候我们仅需要修改艾希的名字即可,省略给他设置type的步骤
实际场景使用
既然提到原型模式考究的是clone的使用,那么在什么场景下会去应用拷贝这样的方式呢?其实个人理解在数据model在多个线程中间传递和使用的时候可以进行使用,为什么这么说呢? `其实在我们请求网络的时候,考虑下再观察者模式下的运行效果,我们需要分发数据model,而对于调用者我们并不清楚上层的开发者会对这个数据model做出getter还是setter操作,如果是写的话,就可能会影响到其他观察者的处理,而这时候就可以应用咱们的clone方式,保证数据在传输过程中不被篡改