一、原型模式是什么?
原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
实现原理:
实现克隆操作,在 JAVA 实现 Cloneable 接口,重写 clone()
二、使用步骤
做小吃的厨房工厂
每次做面条(Noodles)和饺子(Dumplings),工序复杂,如何解决批量生产出一样的饺子,并且耗时减少呢。
我们使用,原型模式
1.创建顶端的食物接口,并实现Cloneable
public abstract class Food implements Cloneable {
//生产
abstract void product();
public Object clone() {
Object clone = null;
try {
clone = super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return clone;
}
}
2.面条 和 饺子。实现Food 接口
public class Noodles extends Food {
public Noodles() {
System.out.println("生产面条了");
}
@Override
public void product() {
//System.out.println("生产面条了....");
}
}
public class Dumplings extends Food {
public Dumplings() {
System.out.println("生产饺子了");
}
@Override
public void product() {
//System.out.println("生产饺子了");
}
}
3. 厨房(cookfactory)
public class CookFactory {
private static Hashtable<String, Food> foodMap = new Hashtable<String, Food>();
//缓存
public static void loadCache() {
foodMap.put("dumplings",new Dumplings());
foodMap.put("noodles",new Noodles());
}
public static Food getFood(String type){
if(StringUtils.isEmpty(type)){
return null;
}else if(type.equalsIgnoreCase("dumplings")){
//
return (Dumplings)foodMap.get("dumplings").clone();
}else if(type.equalsIgnoreCase("noodles")){
//
return (Noodles)foodMap.get("noodles").clone();
}else {
return null;
}
}
}
4.测试
public static void main(String[] args) {
CookFactory.loadCache();
long a = 0 ;
long start = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
CookFactory.getFood("dumplings").product();
CookFactory.getFood("noodles").product();
}
long end = System.currentTimeMillis();
a = end - start;
System.out.println(end - start);
start = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
new Dumplings().product();
new Noodles().product();
}
end = System.currentTimeMillis();
System.out.println(a);
System.out.println(end - start);
}
总结
简单讲,原型模式就是用于,可能需要大量创建,并且构造方法较为复杂的对象时使用。
通过 new 产生一个对象需要非常繁琐的数据准备或访问权限,也可以使用原型模式