原型模式(Prototype pattern):用来创建重复对象。即先将创建过的对象缓存起来,当再次需要使用该对象的时候,使用clone的方式获取。这种方式一般适用于创建对象代价较大的情况下,原型模式创建对象的方式属于浅复制(clone),即复制后的对象并不是原对象,指向的地址值不同,复制后的对象的变化不会影响到原对象,还有一种是深复制,深复制是使用二进制流的方式进行复制。
使用原型模式的,则对象必须实现Clonable接口。
下面通过一个简单的示例来演示一下原型模式的工作原理。
1、超类
public abstract class Parent implements Cloneable{ private String name; private String id; public Parent(String name, String id) { this.name = name; this.id = id; } @Override protected Object clone(){ Object clone = null; try { clone = super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return clone; } //隐藏getter、setter方法 }
2、子类
public class Son extends Parent { public Son1(String name, String id) { super(name, id); } }
3、缓存
public class ClassCache { private static Map<String, Parent> map = new ConcurrentHashMap<>(); public static void addCache(Parent parent) { map.put(parent.getId(), parent); } public static Parent getCache(String id) { Parent parent = map.get(id); return (Parent) parent.clone(); } }
4、测试类
public class MainTest { public static void main(String[] args){ Parent son = new Son1("son1","1"); ClassCache.addCache(son); //添加对象入缓存 Parent sonClone = ClassCache.getCache("1"); //获取对象的clone System.out.println(son == sonClone); //false System.out.println(son.getClass().equals(sonClone.getClass())); //true } }
原型模式clone得到的对象和原对象不是同一个对象,因此 == 得到的结果是false,但是两个对象的getClass方法的结果是一致的,因为两个对象都是同一个类型。