场景
- 克隆技术的过程是怎么样的?克隆 的过程就叫做原型
本质
- 通过new产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式
何时使用
- 当一个系统应该独立于它的产品创建,构成和表示时
- 当要实例化的类是在运行时刻指定时,例如,通过动态装载
- 为了避免创建一个与产品类层次平行的工厂类层次时
- 当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。
优点
- 性能提高
- 逃避构造函数的约束
实例
- 浅复制
测试代码public static void test1() throws Exception { //浅复制,因为复制过去内容如果有另外的对象的话也会跟着改变对象 Sheep sh = new Sheep("多利", new Date(12512531253L)); System.out.println(sh); System.out.println(sh.getName()); System.out.println(sh.getBirthday()); sh.setBirthday(new Date(1111111111111L)); Sheep sh1 = (Sheep)sh.clone(); sh1.setName("少利"); sh1.setBirthday(new Date(1251253125312L)); System.out.println(sh1); System.out.println(sh1.getName()); System.out.println(sh1.getBirthday()); }
- 深复制
测试代码public static void test2() throws Exception { //深复制 Sheep sh = new Sheep("多利", new Date(12512531253L)); System.out.println(sh); System.out.println(sh.getName()); System.out.println(sh.getBirthday()); sh.setBirthday(new Date(1111111111111L)); Sheep sh1 = (Sheep)sh.clone(); sh1.setName("少利"); System.out.println(sh1); System.out.println(sh1.getName()); System.out.println(sh1.getBirthday()); }
- 序列化复制
测试代码
public static void test3() throws Exception { //使用序列化和反序列化实现深复制 Sheep sh = new Sheep("多利", new Date(12512531253L)); System.out.println(sh); System.out.println(sh.getName()); System.out.println(sh.getBirthday()); ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(sh); byte[] bytes = bos.toByteArray(); ByteArrayInputStream bis = new ByteArrayInputStream(bytes); ObjectInputStream ois = new ObjectInputStream(bis); Sheep sh1 = (Sheep) ois.readObject(); sh1.setBirthday(new Date(1111111111111L)); sh1.setName("少利"); System.out.println(sh1); System.out.println(sh1.getName()); System.out.println(sh1.getBirthday()); }