前言
原型模式是在保证性能的同时,用于创建重复的对象。这个方式实现一个原型接口,用于创建这个对象的克隆。比如直接创建对象的代价过大时,就可以使用原型模式。比如一个对象的创建需要高代价的操作数据库后才会被创建。我们可以缓存对象,在下一个请求时返回克隆体。
问:原型模式有什么好处?
答:不必要重复创建,提高性能
问:原型模式有什么缺点?
答:必须实现 Cloneable 接口
代码实现
第一步:创建一个实现了 Cloneable 接口的抽象类。
/**
* @version 1.0
* @Description 颜色类
* @Author wb.yang
* @Date 2019/12/16 21:17
*/
public abstract class BaseColour implements Cloneable {
private String id;
protected String type;
/**
* 画颜色方法
*/
abstract void draw();
public String getType() {
return type;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
/**
* 重写 clone方法
*
* @return
*/
@Override
public Object clone() {
Object clone = null;
try {
clone = super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return clone;
}
}
第二步:创建颜色的实体类
/**
* @version 1.0
* @Description 红色
* @Author wb.yang
* @Date 2019/12/16 21:26
*/
public class Red extends BaseColour {
public Red() {
type = "Red";
}
@Override
void draw() {
System.out.println("this is red");
}
}
/**
* @version 1.0
* @Description 蓝色
* @Author wb.yang
* @Date 2019/12/16 21:37
*/
public class Blue extends BaseColour {
public Blue() {
type = "blue";
}
@Override
void draw() {
System.out.println("this is blue");
}
}
第三步:创建一个类,从数据库获取实体类,并把它们存储在一个 Hashtable 中。
/**
* @version 1.0
* @Description 颜色缓存
* @Author wb.yang
* @Date 2019/12/16 21:39
*/
public class ColourCache {
/**
* 缓存map
*/
private static Hashtable<String, BaseColour> colourMap = new Hashtable<>();
/**
* 从缓存map中获取独享
*
* @param colourId 颜色id
* @return
*/
public static BaseColour getColour(String colourId) {
BaseColour cachedColour = colourMap.get(colourId);
return (BaseColour) cachedColour.clone();
}
/**
* 本地缓存,缓存
*/
public static void loadCache() {
// 加载红色
Red red = new Red();
red.setId("1");
colourMap.put(red.getId(), red);
//加载蓝色
Blue blue = new Blue();
blue.setId("2");
colourMap.put(blue.getId(), blue);
}
第四步:创建原型模式demo,从缓存取出数据。
/**
* @version 1.0
* @Description 原型模式demo
* @Author wb.yang
* @Date 2019/12/16 21:48
*/
public class PrototypePatternDemo {
public static void main(String[] args) {
//加载缓存
ColourCache.loadCache();
//获取红色
BaseColour red = ColourCache.getColour("1");
System.out.println("Colour : " + red.getType());
//获取蓝色
BaseColour blue = ColourCache.getColour("2");
System.out.println("Colour : " + blue.getType());
}
}
第五步:输出运行结果