原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。

原型模式主要用于对象的复制,它的核心是就是类图中的原型类Prototype。Prototype类需要具备以下两个条件:

  • 实现Cloneable接口。在java语言有一个Cloneable接口,它的作用只有一个,就是在运行时通知虚拟机可以安全地在实现了此接口的类上使用clone方法。在java虚拟机中,只有实现了这个接口的类才可以被拷贝,否则在运行时会抛出CloneNotSupportedException异常。
  • 重写Object类中的clone方法。Java中,所有类的父类都是Object类,Object类中有一个clone方法,作用是返回对象的一个拷贝,但是其作用域protected类型的,一般的类无法调用,因此,Prototype类需要将clone方法的作用域修改为public类型。

        原型模式是一种比较简单的模式,也非常容易理解,实现一个接口,重写一个方法即完成了原型模式。在实际应用中,原型模式很少单独出现。经常与其他模式混用,他的原型类Prototype也常用抽象类来替代。

 

Prototype

package design.pattern.prototype;

public final class Prototype implements Cloneable{
    private int version;
    private SubInfo info;
    
    public Prototype(int version, SubInfo info) {
        this.version = version;
        this.info = info;
    }
    
    public int getVersion() {
        return version;
    }
    
    public SubInfo getInfo() {
        return info;
    }
    
    @Override
    public Object clone() throws CloneNotSupportedException {
        Prototype cpo = (Prototype)super.clone();
        cpo.info = (SubInfo) info.clone();
        return cpo;
    }
    
    @Override
    public String toString() {
        return "Prototype: " + this.version + " " + info.getMsg();
    }
}

final class SubInfo implements Cloneable{
    private String msg;
    public SubInfo(String msg) {
        this.msg = msg;
    }
    public String getMsg() {
        return this.msg;
    }
    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

Client

package design.pattern.prototype;

public class Client {
    public static void main(String[] args) throws CloneNotSupportedException {
        Prototype pro1 = new Prototype(1, new SubInfo("version 1"));
        Prototype pro2 = (Prototype) pro1.clone();
        
        System.out.println("(pro1==pro2): " + (pro1==pro2));
        System.out.println("(pro1.getInfo()==pro2.getInfo()): " + (pro1.getInfo()==pro2.getInfo()));
        System.out.println("pro1: " + pro1);
        System.out.println("pro2: " + pro2);
    }
}

 

posted on 2017-10-21 21:31  啊哈咧  阅读(159)  评论(0编辑  收藏  举报