设计模式学习系列之原型模式

来源:互联网 发布:js查找兄弟节点 编辑:程序博客网 时间:2024/04/30 18:37
什么是原型模式?
    原型模式(Prototype Pattern)也叫原始模式,是用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
原型模式的关键是什么?
    JAVA 中的 Object clone() 方法。我们的类都是从Object类继承而来的,Object类本身提供了clone()方法,但是若要要使用clone()方法需要实现Cloneable接口,否则会抛出CloneNotSupportedException。
    这里要注意clone方法本身实现的是一种域对域的拷贝,是一种浅拷贝,因此若我们要拷贝的对象中有一个属性是引用,那么会出现克隆类与原始类共享信息。这样是非常危险的,可能会修改原始数据,因此我们通常需要尽量实现深拷贝。
详解原型模式
    原型模式有两种表现形式,简单形式和登记形式。
    简单形式:        

其中原型模式的简单形式包括三个角色:
    1)客户(Client)角色:客户类提出创建对象的请求。
    2)抽象原型(Prototype)角色:这是一个抽象角色,通常由一个Java接口或Jave抽象类实现。此角色给出所有的具体原型类所需的接口。
    3)具体原型(Concrete Prototype)角色:被复制的对象。此角色需要实现抽象的原型角色所要求的接口。

    Client角色示例代码:

public class PrototypeClient {    private Prototype prototype;        public void operation(Prototype prototype) {        this.prototype = prototype.clone();    }}

     Prototype示例代码:
public interface Prototype extends Cloneable {    Prototype clone();}
        Concrete Prototype示例代码:
public class ConcretePrototype implements Prototype {    @Override    public Prototype clone() {        try {            return (Prototype)super.clone();        } catch (CloneNotSupportedException e) {            e.printStackTrace();        }    return null;    }}
登记形式

    1)客户(Client)角色:客户类提出创建对象的请求。
    2)抽象原型(Prototype)角色:这是一个抽象角色,通常由一个Java接口或Jave抽象类实现。此角色给出所有的具体原型类所需的接口。
    3)具体原型(Concrete Prototype)角色:被复制的对象。此角色需要实现抽象的原型角色所要求的接口。
    4)​原型管理者(Prototype Manager)角色:创建具有原型类的对象,并记录每一个被创建的对象。
    Prototype Manager示例代码:
public class PrototypeManager {    private Vector<Prototype> vector = new Vector<>();        public void add(Prototype prototype) {        vector.add(prototype);    }    public Prototype get(int i) {        return vector.get(i);    }    public int size() {        return vector.size();    }}
原型模式的优点
     1.具有给一个软件动态加载新功能的能力
     2.逃避构造函数的约束。
原型模式的缺点
        每一个类都需要配备一个克隆方法。
原型模式的应用场景
       一个对象多个修改者的场景:当一个对象需要提供给其他多个对象使用,而且每个对象都需要修改该对象时,我们需要克隆出多个对象供其他调用者使用。
        在实际项目中,原型模式通常与工厂模式一起出现,通过clone的方法创建一个对象,然后由工厂方法提供给调用者
参考
​《设计模式之禅》
《java与模式》
1 0
原创粉丝点击