23种设计模式之2.原型模式

245 阅读1分钟

原型模式是用于创建重复的对象,提升创建重复对象的性能,原型模型是实现Cloneable接口,在需要重复对象时不通过构造器创建,而是通过clone方法返回一个克隆对象,原型模式适用于和构造对象时的代价较大,而通过克隆的方式可以提升其创建对象的性能,原型模式一般不会单独出现,而是和其他的设计模式相辅相成。下面就来单独实现一下原型模式:

首先定义一个抽象类实现Cloneable接口,只有实现了Cloneable接口才能进行克隆,重写Object类的clone方法,并把访问权限设置为public(Object类的clone方法访问权限为protected)。

public abstract class Prototype implements Cloneable{

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

然后定义有克隆需求的类继承上述的抽象类:

public class Apple extends Prototype {

    public String color;

    @SneakyThrows
    public Apple(String color) {
        this.color = color;
        Thread.sleep(1000);
    }

    public static void main(String[] args) throws CloneNotSupportedException {
        long startTime = System.currentTimeMillis();
        Apple apple1 = new Apple("红");
        long endTime = System.currentTimeMillis();
        System.out.println("new Apple 对象花费时间:"+ (endTime-startTime) + "ms" );
        startTime = System.currentTimeMillis();
        Apple apple2 = (Apple)apple1.clone();
        endTime = System.currentTimeMillis();
        System.out.println("clone Apple 对象花费时间:"+ (endTime-startTime) + "ms" );
    }
}

我在构造器中sleep1000毫秒,用来模拟创建对象的代价,在main方法中,实例化了对象apple1,克隆了apple2,通过计时的方式统计产生对象的代价,运行结果如下图所示:

image.png

相对于构造器实例化对象,克隆一个对象的代价已经十分小了。