• 简介

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

  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、具体原型:被复制的对象,需实现抽象原型所需要的接口。

  抽象原型代码:

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

  具体原型代码:

 public class ConcrecePrototype implements Prototype{
public Object clone() throws CloneNotSupportedException {
try {
return super.clone();
} catch (Exception e) {
return null;
}
}
}

  客户角色代码:

 public class Client {
private Prototype prototype;
public void operation(Prototype example) throws CloneNotSupportedException{
Prototype p = (Prototype) example.clone();
}
}

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

  这种模式的角色:

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

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

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

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

  抽象原型代码:

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

  具体原型代码:

 public class ConcrecePrototype implements Prototype{
public synchronized Object clone() throws CloneNotSupportedException {
Prototype temp = null;
try {
temp = (Prototype) super.clone();
} catch (Exception e) {
System.out.println("clone fail");
}finally{
return temp;
}
}
}

  原型管理器代码:

 public class PrototypeManager {
private Vector vector = new Vector(); public void add(Prototype e){
vector.add(e);
} public Prototype get(int i){
return (Prototype) vector.get(i);
}
}

  客户端代码:

 public class Client {
private PrototypeManager pm;
private Prototype p; public void registerPrototype(Prototype prototype) throws CloneNotSupportedException{
Prototype temp = (Prototype) prototype.clone();
pm.add(temp);
}
}

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

  • 引深

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

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

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

  • 原始模型模式的优缺点

  优点:

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

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

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

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

  缺点:

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

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

java设计模式--原始模型模式的更多相关文章

  1. Java设计模式——组合模式

    JAVA 设计模式 组合模式 用途 组合模式 (Component) 将对象组合成树形结构以表示“部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有唯一性. 组合模式是一种结构型模 ...

  2. java设计模式--单列模式

    java设计模式--单列模式 单列模式定义:确保一个类只有一个实例,并提供一个全局访问点. 下面是几种实现单列模式的Demo,每个Demo都有自己的优缺点: Demo1: /** * 单列模式需要满足 ...

  3. 3.java设计模式-建造者模式

    Java设计模式-建造者模式 在<JAVA与模式>一书中开头是这样描述建造(Builder)模式的: 建造模式是对象的创建模式.建造模式可以将一个产品的内部表象(internal repr ...

  4. Java设计模式-代理模式之动态代理(附源代码分析)

    Java设计模式-代理模式之动态代理(附源代码分析) 动态代理概念及类图 上一篇中介绍了静态代理,动态代理跟静态代理一个最大的差别就是:动态代理是在执行时刻动态的创建出代理类及其对象. 上篇中的静态代 ...

  5. Java设计模式——外观模式

    JAVA 设计模式 外观模式 用途 外观模式 (Facade) 为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 外观模式是一种结构型模式. 结构

  6. 【设计模式】Java设计模式 -工厂模式

    [设计模式]Java设计模式 -工厂模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长! 目 ...

  7. 【设计模式】Java设计模式 - 原型模式

    [设计模式]Java设计模式 - 原型模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起 ...

  8. 【设计模式】Java设计模式 - 桥接模式

    [设计模式]Java设计模式 - 桥接模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起 ...

  9. 【设计模式】Java设计模式 - 组合模式

    Java设计模式 - 组合模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起记录分享自己 ...

随机推荐

  1. TFS 2013”无法移除仍为团队管理员身份的标识”

    由于开发人员的工作变动,在TFS 2013的日常维护中,经常需要将已经离开团队的成员账户移除出本团队项目. 一.将用户从团队成员中移除 一般情况下,只需要在团队项目的控制面板界面(控制面板>Co ...

  2. 在Asp.Net Core中添加区域的简单实现

    使用区域,可以有效的对业务进行隔离,各种业务及分工可以更灵活.在Asp.Net Core中启用区域也是极简单的. 使用步骤: 1.在 Startup.cs 中添加区域的路由: app.UseMvc(r ...

  3. B+树的特点

    1.B+树是应文件系统产生的B树的变种.它依然是一颗多路查找树,与B树相比它的不同体现在: (1).如果非叶子节点包含n个关键码,则这个节点有n个子树. (2).非叶子节点仅包含关键码信息,叶子节点包 ...

  4. MIT jos 6.828 Fall 2014 训练记录(lab 6)

    源代码参见我的github: https://github.com/YaoZengzeng/jos 在这个实验中将实现一个基于Intel 82540M(又称E1000)的网卡驱动.不过,一个网卡驱动还 ...

  5. Mysql如何清空数据库的所有表数据

    1.先查询出库中的所有表,“db”是数据库名称 SELECT CONCAT('truncate table ',TABLE_NAME,';') AS a FROM INFORMATION_SCHEMA ...

  6. poj1274 The Perfect Stall (二分最大匹配)

    Description Farmer John completed his new barn just last week, complete with all the latest milking ...

  7. UMLUnified Modeling Language (UML)又称统一建模语言或标准建模语言

    1.用例图(use case diagram) 2.活动图(activity diagram) 3.静态结构图 4.顺序图(Sequence Diagram):时序图 5.交互纵览图(Interact ...

  8. 001医疗项目-项目框架的搭建(四个maven工程)

    这个项目资料来源于传智播客.用的是ssm框架, 我们首先建立一个working sets里面存放,我们的maven工程. 如下:

  9. 17Mybatis_动态sql-sql片段

    这篇文章讲一下sql片段. 讲一下sql片段的的需求: 将上边实现的动态sql判断代码块抽取出来,组成一个sql片段.其它的statement中就可以引用sql片段. 方便程序员进行开发. 第一步我们 ...

  10. [转]iptables详解

    FROM : http://blog.chinaunix.net/uid-26495963-id-3279216.html 一:前言   防火墙,其实说白了讲,就是用于实现Linux下访问控制的功能的 ...