博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式-原型(Prototype)
阅读量:7063 次
发布时间:2019-06-28

本文共 3472 字,大约阅读时间需要 11 分钟。

2018-1-12 by Atlas


  • 设计思想

通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的方法创建出更多同类型的对象。原始模型模式允许动态的增加或减少产品类,产品类不需要非得有任何事先确定的等级结构,原始模型模式适用于任何的等级结构。缺点是每一个类都必须配备一个克隆方法。

  • 应用场景

(1)种类过多无法整合成类时。

(2)不容易利用类产生对象实例时。
(3)希望把框架和所产生的对象实例分开时。

  • UML 类图

Prototype UML

  • Prototype(原型) 参与者
    Prototype参与者规定复制(copy)对象实例再建立新对象实例的方法。
  • ConcretePrototype(具体原型)参与者
    ConcretePrototype参与者是实际上实现先复制对象实例再建立新对象实例的方法。
  • Client(客户)参与者
    Client参与者利用复制对象实例的方法产生另一个新对象实例。
  • 原型模式的核心就是复制,表现到java语言就是实现Cloneable,实现clone方法,具体一点,就是clone操作时以原型为模版,分配原型同样大小的内存空间,然后创建一个跟原型一样的对象实例。
  • 简单示例
public class Prototype implements Cloneable {    private int count;    private ShallowCopy shallowCopy;    private static Prototype prototype = new Prototype(0, new ShallowCopy());    private Prototype(int count, ShallowCopy shallowCopy){        this.count = count;        this.shallowCopy = shallowCopy;    }    public Prototype clone() throws CloneNotSupportedException {        Prototype prototype = (Prototype) super.clone();//        prototype.shallowCopy = this.shallowCopy.clone();        return prototype;    }    public static void main(String[] args) throws CloneNotSupportedException {        Prototype p0 = Prototype.prototype;        Prototype p1 = p0.clone();        System.out.println(p0 == p1);        System.out.println(p0.count == p1.count);        System.out.println(p0.shallowCopy == p1.shallowCopy);    }}class ShallowCopy implements Cloneable {    public ShallowCopy clone() throws CloneNotSupportedException {        return (ShallowCopy) super.clone();    }}
  • 成员count、shallowCopy的目的是说明clone操作的“浅拷贝”,不是原型模式的必要元素。
  • 私有化Prototype目的是模拟不通过new语法创建对象实例,测试时尽量通过原型复制对象实例,不是原型模式的必要元素。
  • System.out.println(p0 == p1);输出false;说明clone后的对象实例是在内存中开辟的新空间。
  • System.out.println(p0.count == p1.count);输出true;其实对于基本数据类型来说,数值是存放在对象容器中的,既然对象实例是新开辟的内存空间,数值自然也是复制一份。
  • System.out.println(p0.shallowCopy == p1.shallowCopy);输出true;说明clone的原型对象实例中引用的对象的实例并没有重新开辟内存进行复制,只是复制了对引用对象实例的引用,即“浅拷贝”。
  • // prototype.shallowCopy = this.shallowCopy.clone();解开注释后,System.out.println(p0.shallowCopy == p1.shallowCopy);输出false;说明可以通过对clone对象实例中引用对象同样执行clone来进行深一些层次的拷贝,但是如果对象实例的引用对象不对引用对象的引用对象显式执行clone,无法达到传递拷贝,即完全深拷贝。
  • 当然通过IO操作实现序列化、反序列化对象可以达到深拷贝的效果。
  • 案例鉴赏

Spring中的原型模式。

public abstract class AbstractBeanDefinition extends BeanMetadataAttributeAccessor        implements BeanDefinition, Cloneable {    // ...    public static final String SCOPE_DEFAULT = "";    private String scope = SCOPE_DEFAULT;    public void setScope(String scope) {        this.scope = scope;    }    public String getScope() {        return this.scope;    }    /**     * Return whether this a Singleton, with a single shared instance     * returned from all calls.     * @see #SCOPE_SINGLETON     */    public boolean isSingleton() {        return SCOPE_SINGLETON.equals(scope) || SCOPE_DEFAULT.equals(scope);    }    /**     * Return whether this a Prototype, with an independent instance     * returned for each call.     * @see #SCOPE_PROTOTYPE     */    public boolean isPrototype() {        return SCOPE_PROTOTYPE.equals(scope);    }    /**     * Public declaration of Object's {@code clone()} method.     * Delegates to {@link #cloneBeanDefinition()}.     * @see Object#clone()     */    public Object clone() {        return cloneBeanDefinition();    }    /**     * Clone this bean definition.     * To be implemented by concrete subclasses.     * @return the cloned bean definition object     */    public abstract AbstractBeanDefinition cloneBeanDefinition();    // ...}

转载于:https://blog.51cto.com/damon188/2060454

你可能感兴趣的文章
模数混合电路(模拟、数字电源和地)
查看>>
自然语言处理入门
查看>>
Jquery中children、find区别
查看>>
java窗体
查看>>
zipkin-client:brave核心代码思路整理
查看>>
iOS学习31之UITableVIewCell自定义
查看>>
mysql 分区
查看>>
移动端pc端同步测试工具 Browsersync的安装和使用
查看>>
将获得datebox值的文本形式转为日期格式
查看>>
写给大数据开发初学者的话5[转]
查看>>
LDA数学八卦笔记(三)LDA文本建模
查看>>
2017-2018-1 20155229 《信息安全系统设计基础》课下作业
查看>>
python beautifulsoup爬虫
查看>>
Centos6.x X64 飞信安装
查看>>
python Docker 查看私有仓库镜像
查看>>
mysql主从
查看>>
x2engine
查看>>
1084 矩阵取数问题 V2
查看>>
图片头代码
查看>>
Django 项目创建方法
查看>>