创建型模式 之 原型模式
介绍
原型模式属于创建型设计模式,主要是用于快速的创建重复的对象。
实现方式
通过将一个已经存在的对象进行拷贝克隆出一个相同的对象。
UML
实现代码
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
/**
* @author houkai
* 对象克隆
*/
public abstract class Animal {
abstract void breed();
@Override
protected Object clone() throws CloneNotSupportedException {
//深度拷贝
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try {
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(this);
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return ois.readObject();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
}
import java.util.Hashtable;
/**
* @author houkai
*/
public class AnimalCache {
private static Hashtable<String, Animal> shapeMap = new Hashtable<String, Animal>();
/**
* @param name:【dog】
* @return 克隆后的对象
* @throws Exception
*/
public static Animal getAnimal(String name) throws Exception{
Animal animal = shapeMap.get(name);
return (Animal) animal.clone();
}
/**
* 系统启动初始化对象
*/
public static void loadAnimal(){
//系统启动时候可以注入进来
shapeMap.put("dog", new Dog());
}
}
/**
* @author houkai
* 注意:深度拷贝需要实现序列化
*/
public class Dog extends Animal implements Serializable{
private static final long serialVersionUID = -1895898294386137762L;
@Override
public void breed() {
System.out.println("--- dog --- ");
}
}
/**
* @author houkai
* 原型模式:是用于创建重复的对象,同时又能保证性能
*/
public class PrototypePatternDemo {
public static void main(String[] args) throws Exception {
//系统启动时候将需要的对象建造好
AnimalCache.loadAnimal();
Animal dog = AnimalCache.getAnimal("dog");
dog.breed();
}
}