[设计模式]原型模式

简介: 简介原型模式 (Prototype)用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式是一种对象创建型模式 (可参考 设计模式 创建型模式)。 结构 图-原型模式结构图 Prototype:声明一个克隆自身的接口。

简介


原型模式 (Prototype) 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
原型模式是一种 对象创建型模式可参考 设计模式 创建型模式)。


结构


图-原型模式结构图
Prototype:声明一个克隆自身的接口。
ConcretePrototype 实现克隆自身的具体操作。
Client 调用 Prototype 来克隆自身,从而创建一个新对象。


动机


当要实例化的类是在运行时刻指定时,例如,通过动态装载。
为了避免创建一个与产品类层次平行的工厂类层次时。
当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。 

 

浅拷贝与深拷贝


浅拷贝是指当对象的字段值被复制时,字段引用的对象不会被复制。
例如:如果一个对象有一个指向字符串的字段,并且我们对该对象做了一个浅拷贝,那麽两个对象将引用同一个字符串。
深拷贝是指当一个类拥有资源,当这个类的对象发生复制过程的时候,资源重新分配,这个过程就是深拷贝。

实例


原型模式主要用于对象的复制,它的核心是就是类图中的原型类Prototype。Prototype类需要具备以下两个条件:
  1. 实现Cloneable接口。在java语言有一个Cloneable接口,它的作用只有一个,就是在运行时通知虚拟机可以安全地在实现了此接口的类上使用clone方法。在java虚拟机中,只有实现了这个接口的类才可以被拷贝,否则在运行时会抛出CloneNotSupportedException异常。
  2. 重写Object类中的clone方法。Java中,所有类的父类都是Object类,Object类中有一个clone方法,作用是返回对象的一个拷贝,但是其作用域protected类型的,一般的类无法调用,因此,Prototype类需要将clone方法的作用域修改为public类型。
原型模式是一种比较简单的模式,也非常容易理解,实现一个接口,重写一个方法即完成了原型模式。在实际应用中,原型模式很少单独出现。经常与其他模式混用,他的原型类Prototype也常用抽象类来替代。 

代码

class Prototype  implements Cloneable {
     public Prototype clone() {
        Prototype prototype =  null;
         try {
            prototype = (Prototype) super.clone();
        }  catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
         return prototype;
    }
}

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

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


推荐阅读


本文属于 设计模式系列


参考资料


《大话设计模式》

《HeadFirst设计模式》
目录
相关文章
|
测试技术
黑盒测试、白盒测试、灰盒测试的区别和各自的目的
黑盒测试、白盒测试和灰盒测试是软件测试中常用的测试方法。它们的区别和各自的目的如下: 1. 黑盒测试(Black Box Testing): - 黑盒测试是一种功能性测试方法,使用者只关注输入和输出,不考虑内部结构和实现细节。 - 黑盒测试的目的是验证软件功能是否按照需求规格说明书的要求来执行。 - 测试人员不需要了解软件的内部逻辑和代码,只需关注输入和输出的正确性。 - 黑盒测试可通过设计测试用例,模拟用户使用软件的场景,以验证系统的正确性。 2. 白盒测试(White Box Testing): - 白盒测试是一种结构性测试方法,测试人员了解软件的内部结构
3470 0
|
监控 网络协议 安全
网络:IP地址、子网掩码、网络地址、广播地址、网段、网关
网络:IP地址、子网掩码、网络地址、广播地址、网段、网关
2943 1
网络:IP地址、子网掩码、网络地址、广播地址、网段、网关
|
机器学习/深度学习 人工智能 数据可视化
别再用平均池化层了!Meta AI把注意力塞到池化层,性能立刻提升0.3
注意力机制这么好用,怎么不把它塞到卷积网络里?最近Meta AI的研究人员提出了一个基于注意力的池化层,仅仅把平均池化层替换掉,就能获得+0.3%的性能提升!
449 0
别再用平均池化层了!Meta AI把注意力塞到池化层,性能立刻提升0.3
UVa11076 - Add Again
UVa11076 - Add Again
81 0
【LeetCode】剑指 Offer(6)
【LeetCode】剑指 Offer(6)
139 0
|
前端开发 Java 应用服务中间件
从 0 开始手写一个Tomcat,7 步搞定!
Tomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!
237 0
从 0 开始手写一个Tomcat,7 步搞定!
|
运维 监控 测试技术
移动端性能优化系列—启动速度
移动端性能对用户体验、留存有着至关重要的影响,作为开发者是不是被这样吐槽过,“这个 APP 怎么这么大?”、“怎么一直在 APP 封面图转悠,点不进去”、“进入详情效果有些卡”、“用 4G 使用你们的 APP,我的流量有点不够啊”等等,这些问题都直观反映出,一个体验良好的应用,只有功能健全还不够。
移动端性能优化系列—启动速度
|
Web App开发 测试技术 Python
Selenium2+python自动化1-环境搭建
前言 目前selenium版本已经升级到3.0了,网上的大部分教程是基于2.0写的,所以在学习前先要弄清楚版本号,这点非常重要。本系列依然以selenium2为基础,目前selenium3坑比较多,暂时没精力去研究,后续会出相关教程。
1929 0
|
7天前
|
人工智能 运维 安全
|
5天前
|
人工智能 异构计算
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!