1.什么是原型模式
- 原型(prototype)的理解需要和复制/克隆联系
- 原型的意思就是按照对象A,复制/拷贝一份,形成一个单独独立的新的对象B,我们对对象B进行操作,而原来被复制/拷贝的对象A就称为对象B的原型
- 原型模式的使用场景就是当一个对象的创建比较复杂的时候,我们耗费了一些资源好不容易创建出了一个对象A,如果此时我们需要再创建一个对象B,那么我们不需要再去经过前面繁琐的步骤创建对象B,而是直接复制粘贴对象A,得到一个完整对立的对象B
2.怎么使用原型模式
- 原型模式的克隆实现方式就是原来我们学习的对象的克隆,即实现接口Cloneable并调用方法clone()
- 克隆实现原理
1.代码实现
- 定义一个类用于被克隆
import java.util.Date; public class Prototype implements Cloneable{ //需要被克隆的类 private String name; private Date date; public Prototype(String name, Date date) { this.name = name; this.date = date; } @Override protected Object clone() throws CloneNotSupportedException { //覆写Object的clone() return super.clone(); } }
- 编写一个类进行克隆
import java.util.Date; public class Clone { public static void main(String[] args) throws CloneNotSupportedException { Date date = new Date(); Prototype p1 = new Prototype("原型1号",date); Prototype p2 = (Prototype) p1.clone(); System.out.println("对象==>P1 = "+p1); System.out.println("对象==>P2 = "+p2); System.out.println("哈希值==>P1 = "+p1.hashCode()); System.out.println("哈希值==>P2 = "+p2.hashCode()); } }
- 上面的对象克隆是存在问题的,即对象的"浅拷贝"是有问题的,原因:
import java.util.Date; public class Clone { public static void main(String[] args) throws CloneNotSupportedException { Date date = new Date(); Prototype p1 = new Prototype("原型1号",date); Prototype p2 = (Prototype) p1.clone(); System.out.println("Date修改之前===================>"); System.out.println("对象==>P1 = "+p1); System.out.println("对象==>P2 = "+p2); date.setTime(5153414); System.out.println("Date修改之后===================>"); System.out.println("对象==>P1 = "+p1); System.out.println("对象==>P2 = "+p2); } }
- 可见就算p1和p2是两个相互独立的对象,但是它们的内部属性指向的对象是一样的,这样的情况导致的后果就是所有克隆得到的对象,一旦我们修改了原型中某一个成员属性的对象引用,克隆的对象也会跟着改变,这显然就和两个相互独立的对象的情况相互矛盾的,则就是克隆浅克隆(只是克隆了对象本身,对于对象中的对象属性并没有克隆,而是指向了同一个引用)的缺陷,所以我们需要实现克隆的深克隆(将对象的对象属性也进行克隆)
- 改造clone()
@Override protected Object clone() throws CloneNotSupportedException { //覆写Object的clone() Object obj = super.clone();//obj就是返回的克隆对象 Prototype prototype = (Prototype) obj;//强转类型设置时间属性 prototype.setDate((Date) this.date.clone());//设置克隆对象的date属性为当前进行克隆对象的原型对象的date成员属性的克隆 return obj;//返回克隆好的对象 }
- 测试
- 通过深克隆解解决了浅克隆的对象属性的问题
3.小结
- 到此,所有的创建型模式就讲解完了
- 单例模式:保证类的实例全局唯一
- 工厂模式:实现了创建者和调用者的分离;分为简单工厂模式和工厂方法模式
- 抽象工厂模式:就是对工厂进行抽象,创建的工厂针对于生产产品族,即工厂可以生产一系列的产品
- 建造者模式:实现了对象的创建和使用的分离
- 原型模式:通过Java提供的克隆方法提高复杂对象的生产方式