• 简介

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

  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 extends Cloneable{
2     public Object clone() throws CloneNotSupportedException;
3 }

  具体原型代码:

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

  客户角色代码:

1 public class Client {
2     private Prototype prototype;
3     public void operation(Prototype example) throws CloneNotSupportedException{
4         Prototype p = (Prototype) example.clone();
5     }
6 }

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

  这种模式的角色:

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

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

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

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

  抽象原型代码:

1 public interface Prototype extends Cloneable{
2     public Object clone() throws CloneNotSupportedException;
3 }

  具体原型代码:

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

  原型管理器代码:

 1 public class PrototypeManager {
 2     private Vector vector = new Vector();
 3
 4     public void add(Prototype e){
 5         vector.add(e);
 6     }
 7
 8     public Prototype get(int i){
 9         return (Prototype) vector.get(i);
10     }
11 }

  客户端代码:

1 public class Client {
2     private PrototypeManager pm;
3     private Prototype p;
4
5     public void registerPrototype(Prototype prototype) throws CloneNotSupportedException{
6         Prototype temp = (Prototype) prototype.clone();
7         pm.add(temp);
8     }
9 }

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

  • 引深

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

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

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

  • 原始模型模式的优缺点

  优点:

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

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

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

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

  缺点:

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

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

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

  1. Java 设计模式——状态模式

    概述 很多人在说状态模式的时候总拿策略模式来进行对比,可能他们的类图会有一点类似,可我却不认为他们有多么相像.你可以阅读<Java设计模式--策略模式>这篇博客,并与本文对比,以找到蛛丝马 ...

  2. Java设计模式——Builder模式

    前言 之前写Android程序的时候,经常会用到Dialog(对话框)这个控件.我们在使用Dialog,比如AlertDialog的时候就用到了这里要说明的Builder模式.现在我们来看一下这样的一 ...

  3. Java设计模式-工厂模式(3)抽象工厂模式

    在Java设计模式-工厂模式(2)工厂方法模式 我们知道了工厂方法模式解决了简单工厂模式中的缺陷,做到了满足开闭原则,但是时代是进步的,进而又产生新的问题,工厂难道只能生产一种东西吗.我们所见到的工厂 ...

  4. Java设计模式-工厂模式(2)工厂方法模式

    在Java设计模式-工厂模式(1)简单工厂模式 中我们介绍了简单工厂模式,提到了简单工厂模式违背了开闭原则,而"工厂方法模式"是对简单工厂模式的进一步抽象化,其好处是可以使系统在不 ...

  5. Java设计模式-工厂模式(1)简单工厂模式

    Java设计模式-工厂模式(1)简单工厂模式 一.前言 1)例子 2)类图关系 3)代码实现 二.简单工厂模式 2.1.概述: 2.2.类图关系: 2.3.代码修改: 2.4.优缺点 2.5.扩展-简 ...

  6. java设计模式代理模式_Java中的代理设计模式

    java设计模式代理模式 代理对象或代理对象为另一个对象提供占位符,以控制对该对象的访问. 代理充当原始对象的轻量级版本或简化版本. 它支持与原始对象相同的操作,但可以将那些请求委托给原始对象以实现它 ...

  7. java设计模式 订阅模式_Java中的外观设计模式

    java设计模式 订阅模式 立面是指建筑物的外观. 当穿过街道时,我们所看到的只是建筑物的外观. 该工作面抽象了建筑物的所有复杂实现细节. 同样, 外观设计模式旨在为子系统中的一组接口提供统一的接口. ...

  8. java设计模式 订阅模式_Java中的复合设计模式

    java设计模式 订阅模式 当我们必须使用对象的树状分层结构时,复合设计模式非常有用. 它使我们能够统一对待单个对象和对象组成. 它属于结构设计模式的范畴,因为它将对象组合成树形结构以表示部分整个层次 ...

  9. java设计模式迭代器模式_迭代器设计模式示例

    java设计模式迭代器模式 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式 ...

最新文章

  1. 摄像头自动曝光_OPPO新专利曝光:手写笔不仅仅只是手写笔 它还是手机的额头...
  2. implementation ‘com.zxy.android:recovery:
  3. python opencv cv.waitKey(1) 0xFF 的作用
  4. 【Socket】linux套接字技术之tcp
  5. equals()和==
  6. C:\WINDOWS\Installer文件夹的安全清理
  7. StackExchange.Redis性能调优
  8. TW实习日记:第16天
  9. Java 8都出那么久了,Stream API了解下?
  10. java 中间容器 表格_【JAVA SE基础篇】45.迭代器、Collections工具类以及使用容器存储表格...
  11. Rect 的相关操作
  12. 【机器学习-西瓜书】七、朴素贝叶斯分类器
  13. 怎么使用Vegas制作炫彩灯光效果?
  14. iOS备忘录之IOS开发的一些网站(看看还是不错的)
  15. Msm8960(APQ8064)平台的MSM-AOSP-kitkat编译适配(2):开发环境及相关的使用技巧
  16. 笔记本移动硬盘linux系统安装教程,移动硬盘怎么安装系统 移动硬盘安装系统教程【图文】...
  17. dell poweredge服务器_这款AMD服务器不简单
  18. QML 导入ttf图标库
  19. 如何寻找适合的投稿SCI期刊
  20. 第五届传智杯-初赛【B组-题解】

热门文章

  1. STL之hashtable源代码剖析
  2. HomeKit推出已两年 但是苹果在智能家居上却被对手甩开了差距
  3. how-to-get-a-job-in-deep-learning
  4. Console.ReadLine(); 获取用户输入内容
  5. Dom4j和Xpath(转)
  6. SQL Server 自动增长清零
  7. 第四课:算法效率的度量和存储空间需求
  8. 洛谷P1036选数(素数+组合数)
  9. 好用的爬虫软件?动态ip软件告诉你
  10. 让我为你介绍一个神器:Chimee,一套可扩展的 H5 视频播放器解决方案