/**
* 设计模式(5)
* 原型模式
*
* 该模式用于生成对象非常繁琐或者耗费时间的情况
* 使用clone()方法可以相对快速的“复制”一个对象
* 但是要注意,该方式创建的方法是浅拷贝,对象的成员对象将只是拷贝的引用
*
*/
// 抽象类- 实现自克隆接口
abstract class Pet implements Cloneable {
// 定义一个id
private int id = 0;
public int getId() {
return this.id;
}
public void setId(int id) {
this.id = id;
}
// 抽象方法
abstract void run();
// 克隆方法
public Object clone() {
Object object = null;
try {
object = super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return object;
}
}
// 两个实现类 均继承自抽象类Pet
class Dog extends Pet {
@Override
void run() {
System.out.println("dog.running...");
}
}
class Cat extends Pet {
@Override
void run() {
System.out.println("cat.running...");
}
}
// 生成原型的类
class PetCache {
private static HashMap<Integer,Pet> petMap = new HashMap<>();
// 获取map中装载对象的克隆
public static Pet getPet(int id) {
return (Pet) petMap.get(id).clone();
}
// 初始化
public static void init() {
// 将每种宠物的一个对应的对象,按照自己设置的id放进map
Dog a = new Dog();
a.setId(1);
Cat b = new Cat();
b.setId(2);
petMap.put(a.getId(),a);
petMap.put(b.getId(),b);
}
}
// 测试
// Test Prototype Pattern
public class main {
public static void main(String[] argv) {
PetCache.init();
Pet dog = PetCache.getPet(1);
dog.run();
Pet cat = PetCache.getPet(2);
cat.run();
}
}
/*
输出:
dog.running...
cat.running...
*/
转载于:https://my.oschina.net/tasker/blog/812477