java设计模式--原始模型模式

  • 简介

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

  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不予以复制,或者自行创建出相当的同种对象。

时间: 2024-08-26 04:21:30

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

Java 设计模式 -- 复合模式之二

接着上文的鸭鸣例子:Java 设计模式 -- 复合模式之一 上文中,我们的鸭鸣实现了 装饰者模式  适配器模式  工厂模式的结合 现在,又需要进行改动了,上文,是可以统计一群鸭子的叫声,现在需要能够观察个别鸭子的行为 引入观察者模式: 任何想被观察的Quackable都必须实现下面的接口 public interface QuackObservable { public void registerObserver(Observer observer); public void notifyobs

一起学java设计模式--代理模式(结构型模式)

代理模式 应用软件所提供的桌面快捷方式是快速启动应用程序的代理,桌面快捷方式一般使用一张小图片来表示(Picture),通过调用快捷方式的run()方法将调用应用软件(Application)的run()方法.使用代理模式模拟该过程,绘制类图并编程实现. package ProxyPattern; interface Software { void run(); } class Application implements Software { public void run() { Syste

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

Java设计模式-代理模式之动态代理(附源码分析) 动态代理概念及类图 上一篇中介绍了静态代理,动态代理跟静态代理一个最大的区别就是:动态代理是在运行时刻动态的创建出代理类及其对象.上篇中的静态代理是在编译的时候就确定了代理类具体类型,如果有多个类需要代理,那么就得创建多个.还有一点,如果Subject中新增了一个方法,那么对应的实现接口的类中也要相应的实习该方法,不符合设计模式原则. 动态代理的做法:在运行时刻,可以动态创建出一个实现了多个接口的代理类.每个代理类的对象都会关联一个表示内部处理

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

Java设计模式-代理模式之动态代理(附源代码分析) 动态代理概念及类图 上一篇中介绍了静态代理,动态代理跟静态代理一个最大的差别就是:动态代理是在执行时刻动态的创建出代理类及其对象. 上篇中的静态代理是在编译的时候就确定了代理类详细类型.假设有多个类须要代理.那么就得创建多个. 另一点,假设Subject中新增了一个方法,那么相应的实现接口的类中也要相应的实现这些方法. 动态代理的做法:在执行时刻.能够动态创建出一个实现了多个接口的代理类.每一个代理类的对象都会关联一个表示内部处理逻辑的Inv

Java设计模式-代理模式之静态代理

Java设计模式-代理模式之静态代理 概念 为另一个对象提供一个替身或占位符以提供对这个对象的访问,使用代理模式创建代表对象,让代表对象控制某对象的访问,被代理对象可以是远程的对象.创建开销大的对象或需要安全控制的对象 远程代理控制访问远程对象 虚拟代理控制访问创建开销大的资源 保护代理基于权限控制对资源的访问 看如下的类图: 仔细看上面的类图,首先是Subject它为RealSubject和Proxy提供了接口,通过实现同一个接口,Proxy在RealSubject出现的地方取代它,这点和适配

Java设计模式--生成器模式

将一个复杂对象的构建与它的表示分离,使同样的构建过程可以创建不同的表示. Builder Pattern Separate the construction of a complex object from its representation so that the same construction process can create different representations. 类图 模式的结构与使用 生成器模式的结构中包括四个角色. 产品(Product):具体生成器要构造的复

Java设计模式——迭代器模式

概述 网上大部分人说迭代模式的时候,总是以某一种可遍历的对象为例进行介绍.这是可行的,这也是迭代模式的基本原型.当我看到<Head Frist设计模式>中迭代模式的时候,感觉要是能从另一个角度来说明,可能更能够体现迭代模式的威力所在. 本文介绍的这种迭代模式,倒是更像是适配器-迭代器模式.希望于你有益~ 版权说明 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:Coding-Naga发表日期: 2016年3月4日链接:http://blog.csdn.net/lemo

Java设计模式——原型模式

概述 原型模式是为了解决一些不必要的对象创建过程.当Java JDK中提供了Cloneable接口之后,原型模式就变得异常的简单了.虽然由于Cloneable的引入使用程序变得更简单了,不过还是有一些需要说明和注意的东西在里面的.文本就详细讲解一下这些注意事项吧. 版权说明 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:Coding-Naga发表日期: 2016年3月3日链接:http://blog.csdn.net/lemon_tree12138/article/d

Java 设计模式——原型模式(Prototype)

原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象. 原型模式有简单形式和登机形式两种表现 形式. 简单形式的原始模型模式 简单形式UML类图如下: 原型模式的角色有 客户端角色(ClientPro): 抽象原型角色(ProtoType): 具体原型角色(ConcreteProtoType):被复制的对象 代码如下: public interface ProtoType { /** * 根据自身克隆出新的对象 * @aut