创建型模式 之 原型模式

介绍

       原型模式属于创建型设计模式,主要是用于快速的创建重复的对象。

实现方式

     通过将一个已经存在的对象进行拷贝克隆出一个相同的对象。

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();		
	}
}