Java常用设计模式————原型模式(一)

介绍

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

        原型模式用于创建重复的对象,同时又能保证性能。当直接创建对象的代价比较大时,则采用这种模式。(例如,一个对象需要在高代价的数据库操作之后被创建,并结合缓存机制,在下一次请求时返回它的克隆对象,在需要的时候更新数据库,以此来减少数据库调用)。

        原型模式的核心就是原型类,原型类需要具备以下两个条件

        ·实现Cloneable接口。

        Java中的Cloneable接口,作用只有一个:在运行时通知虚拟机可以安全地在实现了此接口的类上使用clone()方法。在JVM中,只有实现了这个接口的类才可以被拷贝,否则在运行时会抛出CloneNotSupportedException异常。

        ·重写Object类中的clone()方法。

        Object类中的clone()方法,作用是返回对象的一个拷贝,但是其作用域protected类型的,一般的类无法调用,因此,Prototype类需要clone()方法的作用域修改为public  。

深拷贝与浅拷贝

《Java常用设计模式————原型模式(二)之深拷贝与浅拷贝》

应用场景

        使用原型模式创建对象比直接new一个对象在性能上要好的多,因为Object类的clone方法是一个本地方法,它直接操作内存中的二进制流,特别是复制大对象时,性能的差别非常明显。
        使用原型模式的另一个好处是简化对象的创建,使得创建对象就像我们在编辑文档时的复制粘贴一样简单。
        因为以上优点,所以在需要重复地创建相似对象时可以考虑使用原型模式。比如需要在一个循环体内创建对象,假如对象创建过程比较复杂或者循环次数很多的话,使用原型模式不但可以简化创建过程,而且可以使系统的整体性能提高很多。

优缺点

优点:

1.将产品的创建过程封装起来,客户端不需要了解产品的具体创建流程。

2.性能提高,逃避构造函数的约束,尤其是那些很复杂的对象的时候。

3.可以在不修改其他代码的情况下添加新的产品,符合“开闭原则”。

缺点:

1.配备克隆方法需要对类的功能进行通盘考虑,这对于新的类不一定容易,特别当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候。

2.必须实现一个特定接口。

3.每一个类都必须有一个clone方法,如果这个类的组成不太复杂的话还比较好,如果类的组成很复杂的话,如果想实现深度复制就比较困难了。

代码实现

第一步:创建原型类

package design.pattern.prototype;
/**
 * 原型模式实现类
 * 
 * <br>类名:ConcretePrototype<br>
 * 作者: mht<br>
 * 日期: 2018年3月31日-上午10:14:00<br>
 */
public class ConcretePrototype extends Prototype{

    public void show() {
        System.out.println("原型模式实现类...");
    }
}

第二步:实现原型类继承

package design.pattern.prototype;
/**
 * 原型类
 * <br>类名:Prototype<br>
 * 作者: mht<br>
 * 日期: 2018年3月31日-上午10:12:48<br>
 */
public abstract class Prototype implements Cloneable{

    @Override
    protected Object clone() {
        try {
            return super.clone();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

测试

package design.pattern.prototype;

public class Client {

    public static void main(String[] args) {
        ConcretePrototype cp = new ConcretePrototype();
        for (int i = 0; i < 10; i++) {
            ConcretePrototype c = (ConcretePrototype) cp.clone();
            c.show();
        }
    }
}

输出结果:

原型模式实现类...
原型模式实现类...
原型模式实现类...
原型模式实现类...
原型模式实现类...
原型模式实现类...
原型模式实现类...
原型模式实现类...
原型模式实现类...
原型模式实现类...

猜你喜欢

转载自blog.csdn.net/u014745069/article/details/79764210