Java设计模式之创建型模式-原型模式(Prototype)

  和上篇设计模式的间隔时间有点长了,今天来讲讲最后一个创建型模式–原型模式。

示例

  我们先设想这样一个场景,比方说我们有一个从数据库读取出来的对象,而现在我们在程序中多次修改了这些数据,那么很显然我们需要再从数据库重新加载所有的数据,这样一来的代价是比较大的,所以这并不是一个很好的主意。
  
  针对以上情况,更好的方法是将现有对象克隆到一个新的对象当中,然后再进行数据的操作。

原型模式: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

两个条件

原型模式当中,其核心在于原型类,而原型类需要满足如下两个条件:
  
  1. 实现Cloneable接口。看源码我们可以发现Cloneable接口实际上是一个空接口(标记接口)。标明只有实现了这个接口才能够被复制,否则在运行的时候会抛出CloneNotSupportedExceptio异常。
  2. 重写Object类中的clone方法。 Object类作为顶级父类,其包含一个clone方法用来返回对象的一个拷贝。

具体实现

  首先创建一个原型类 Prototype,实现Cloneable接口,重写clone方法。

public class Prototype implements Cloneable {

    @Override
    public Prototype clone() throws CloneNotSupportedException {
        return (Prototype) super.clone();
    }
}

  其次再创建一个具体原型类 ConcreatePrototype。

public class ConcreatePrototype extends Prototype {
    public void print() {
        System.out.println("具体原型类...");
    }
}

  最后写个原型测试类 PrototypeTest

public class PrototypeTest {
    public static void main(String[] args) throws CloneNotSupportedException {
        ConcreatePrototype cp = new ConcreatePrototype();

        ConcreatePrototype clone1 = (ConcreatePrototype) cp.clone();
        ConcreatePrototype clone2 = (ConcreatePrototype) cp.clone();

        cp.print();
        clone1.print();
        clone2.print();
    }
}

  运行结果如下:

具体原型类...
具体原型类...
具体原型类...

优点

  1.性能提高: 使用原型模式来创建对象要比直接new对象在性能方面要好的多,尤其是对象为大对象时,性能的差异是非常明显的。
  2.隐藏了对象的创建细节: 对象的复制通过调用Object类的clone方法来完成,其直接在内存当中复制数据,不会去调用类的构造方法。

浅拷贝和深拷贝的简单区分

  说到拷贝,我们会想到浅拷贝深拷贝两个概念,因为不是本篇博客的重点,所以我就简单区分下,具体请查看我的另一篇博客 Java浅拷贝和深拷贝简述。

浅拷贝

  被复制的对象所有的变量都含有与原来对象相同的值,所有的对其他对象的引用都仍然指向原来的对象。

深拷贝

  被复制的对象所有的变量都含有与原来对象相同的值,所有的对其他对象的引用也都指向复制过的新的对象。

  总之,一般在初始化信息不发生变化的情况下,克隆是最好的办法。

你可能感兴趣的:(设计模式)