简介

原始模型模式属于对象的创建模式。通过一个原型对象来指明要创建对象的类型,然后用复制原型对象的方法来创建出更多同类型的对象。

Java所有的类都是从java.lang.Object类继承来的,Object类提供clone()方法对对象进行复制。一般调用clone()方法需要满足一下条件:

1、对于任何对象x,都有:x.clone()!=x。也就是克隆的对象和原对象不是一个对象。

2、对于任何对象x,都有:x.clone().getClass()=x.getClass()。也就是克隆对象与原对象是相同的类型。

3、如果对象x的equal()方法定义恰当的话,那么x.clone().equal(x)应该成立。

原始模型模式

原始模型模式分为两种类型:1、简单形式;2、登记形式。下面分别解释下这两种类型。

简单形式的原始模型模式类图:

这种模式的三个角色:

1、客户角色:客户提出创建对象的请求。

2、抽象原型:抽象角色,给出具体原型所需的接口。

3、具体原型:被复制的对象,需实现抽象原型所需要的接口。

抽象原型代码:

1 public interface Prototype extendsCloneable{2 public Object clone() throwsCloneNotSupportedException;3 }

具体原型代码:

1 public class ConcrecePrototype implementsPrototype{2 public Object clone() throwsCloneNotSupportedException {3 try{4 return super.clone();5 } catch(Exception e) {6 return null;7 }8 }9 }

客户角色代码:

1 public classClient {2 privatePrototype prototype;3 public void operation(Prototype example) throwsCloneNotSupportedException{4 Prototype p =(Prototype) example.clone();5 }6 }

登记形式的原始模型模型类图:

这种模式的角色:

1、客户角色:客户提出创建对象的请求。

2、抽象原型:抽象角色,给出具体原型所需的接口。

3、具体原型:被复制的对象,需实现抽象原型所需要的接口。

4、原型管理器:创建具体原型类对象,并记录每一个被创建的对象。

抽象原型代码:

1 public interface Prototype extendsCloneable{2 public Object clone() throwsCloneNotSupportedException;3 }

具体原型代码:

1 public class ConcrecePrototype implementsPrototype{2 public synchronized Object clone() throwsCloneNotSupportedException {3 Prototype temp = null;4 try{5 temp = (Prototype) super.clone();6 } catch(Exception e) {7 System.out.println("clone fail");8 }finally{9 returntemp;10 }11 }12 }

原型管理器代码:

1 public classPrototypeManager {2 private Vector vector = newVector();3

4 public voidadd(Prototype e){5 vector.add(e);6 }7

8 public Prototype get(inti){9 return(Prototype) vector.get(i);10 }11 }

客户端代码:

1 public classClient {2 privatePrototypeManager pm;3 privatePrototype p;4

5 public void registerPrototype(Prototype prototype) throwsCloneNotSupportedException{6 Prototype temp =(Prototype) prototype.clone();7 pm.add(temp);8 }9 }

可以看出,如果要创建的原型对象少且固定的话可以考虑使用简单形式的原型模式。如果要创建的原型对象不固定,可以使用登记形式的原型模式。原型对象有原型管理器保管,如果其中有则直接拿出,没有则复制并加入其中。

引深

看到这里就会想到了java中重要的话题:浅复制和深复制。

浅复制:被复制对象的所有变量都与原来对象有相同的值,而所有对其对象的引用都指向原对象。浅复制只考虑复制所考虑的对象,而不复制它所引用的对象。

深复制:被复制对象的所有变量都与原来对象有相同的值,那些引用其他对象的变量指向被复制的新对象。深复制中那些引用其他对象的变量将指向被复制过的新对象,也就是深复制把要复制的对象所引用的对象都复制了一遍。

原始模型模式的优缺点

优点:

1、  原始模型模型模式允许动态地增加或减少产品类。由于创建产品类实例的方法是产品类内部具有的,因此,增加新产品的对整个结构没有影响。

2、  原始模型模式提供简化的创建结构。工厂方法模式常常需要有一个与产品类等级相同的结构,而原始模型模式就不需要这样。

3、  具有给一个应用软件动态加载新功能的能力。

4、  产品类不需要非得有任何事先确定的等级结构,因为原始模型模式适用于任何的等级。

缺点:

原始模型模式最主要的缺点就是需要为每一个类都必须具备一个复制方法。

另外,如果在原型对象中有间接对象,可以将间接对象设置为transient不予以复制,或者自行创建出相当的同种对象。

原文:http://www.cnblogs.com/lcngu/p/5388974.html

java原始模型模式_java设计模式--原始模型模式相关推荐

  1. 组合模式_Java设计模式-组合模式

    在现实生活中,存在很多"部分-整体"的关系,例如,大学中的部门与学院.总公司中的部门与分公司.学习用品中的书与书包.生活用品中的衣月艮与衣柜以及厨房中的锅碗瓢盆等.在软件开发中也是 ...

  2. java 行为模式_java设计模式--行为模式

    前言 行为模式是描述多个类与对象之间通过协作共同完成单个对象无法单独完成的任务. 行为模式分为: 类行为模式通过集成在类之间分派行为 对象行为模式通过组合或聚合在对象之间分配行为 行为模式: 模板方法 ...

  3. java输出不同颜色_Java设计模式-策略模式、状态模式

    推荐阅读: 一只Tom猫:都是"Redis惹的祸",害我差点挂在美团三面,真是"虚惊一场"! java喵:6大面试技能树:JAVA基础+JVM+算法+数据库+计 ...

  4. java模板方法模式_JAVA 设计模式 模板方法模式

    定义 模板方法模式 (Template Method) 定义了一个操作中的算法的骨架,而将部分步骤的实现在子类中完成. 模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 模 ...

  5. java 备忘录模式_java设计模式--备忘录模式

    备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象外保存这个状态,这样以后可将此对象恢复成原来的状态. 就拿单机游戏举例,玩游戏打boss前我们通常都会存档,避免打boss时失误死 ...

  6. java外观设计修改_Java设计模式之外观模式和装饰器模式的设计(精选)

    前言 本篇来学习下结构型模式的外观模式和装饰器模式. 外观模式 简介 外观模式隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这种类型的设计模式属于结构型模式,它向现有的系统添加一个接 ...

  7. java web简单工厂模式_JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)

    在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一 ...

  8. java工厂方法_Java设计模式之工厂方法模式

    2.工厂方法模式 <设计模式之禅>中用神话故事女娲造人来比概述工厂方法模式. 女娲采集黄土捏成人的形状,然后放到八卦炉中烧制,最后放置到大地上生长,工艺过程是没有错的,但是意外随时都会发生 ...

  9. java设计模式中不属于创建型模式_Java设计模式(5)——创建型模式之建造者模式(Builder)...

    一.概述 概念 将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示.(与工厂类不同的是它用于创建复合对象) UML图 主要角色 抽象建造者(Builder)--规范建造方法与结果返还 ...

最新文章

  1. python找不到reshape_如何加速Python程序
  2. 《深入理解计算机系统》读书笔记二:内存,高速缓存存储器
  3. 安卓Socket处理
  4. plsql developer 安装在win7 64位电脑路径问题
  5. Detected cartesian product for LEFT OUTER join
  6. php unexpected t_object_operator,php - PHP中的“Unexpected T_OBJECT_OPERATOR”错误
  7. JVM Java内存区域 与 内存溢出 (系列号1)
  8. vb.net 使用MD5密碼加密
  9. 用简道云做一个可以账号密码登陆和找回密码并查询修改已填信息的公开表单
  10. 有刷/无刷动力电调与马达知识
  11. 计算机主板测评,性能测试及评测室总结
  12. javacv 写mp4_JavaCV 实现视频转码
  13. mma7660(gsensor)的hwmon驱动
  14. python写法教程_Python的表达式写法
  15. 制作价目表用什么软件
  16. php微信跳转到支付宝,微信点击短链接直接跳转到支付宝领红包教程 附带例子...
  17. python 通信中间件_python 终极篇 ---- 中间件
  18. 蓄水池抽样算法(reservoir sampling)
  19. JSP对接国际验证码接口DEMO示例
  20. 提问技巧(特别适用IT)

热门文章

  1. linux mysql8.0 rpm安装_Linux(CentOS7)使用 RPM 安装 mysql 8.0.11的教程
  2. 中国的TD-LTE-Advanced被国际电联确立为4G标准!
  3. PPStream、PPlive等播放器花屏之解决办法
  4. CMB中相关仪器设备和术语
  5. 使用 vscode 调试前端代码
  6. jQuery获取json数据
  7. 关注CIO 3.0:企业CIO的最佳时代到来
  8. 设计模式学习笔记(八:迭代器模式)
  9. 完毕port(CompletionPort)具体解释 - 手把手教你玩转网络编程系列之三
  10. java编程思想(第四版)第二章练习题-12