`
xiandaoyan
  • 浏览: 21419 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论
阅读更多

基本概念

原始模型属于对象的创建模式。通过给出一个原型对象来指明所要创建的对象的类型,然后调用赋值这个原型对象的办法来创建出更多同类型的对象。

Java语言构建模型直接支持原始模型。

变量、对象以及对象的引用

Panda myPanda = new Panda();

这句话代表了一下几个意思:

A.创建了一个Panda类型变量,名字叫myPanda

B.建立了一个Panda类的对象;

C.使变量myPanda指到这个对象。

如果存在一下赋值:

thatPanda = myPanda;这只是引用的赋值,两个引用同时指向一个唯一的Panda对象。

对象的复制

Clone方法:

object类的clone方法被调用来复制一个对象时,此对象对其它对象的引用也同时被复制一份。Java语言提供的Cloneable接口只起一个作用,就是在运行期通知Java虚拟机这个可以安全的在这个类上使用clone方法。由于Object类本身没有实现Cloneable接口,所以如果所考虑的类没有实现Cloneable接口时,调用clone方法会跑出CloneNotSupportedException异常。

克隆满足的条件:

A.对任何对象x,有x.clone() ! = x。克隆对象与原对象不是一个对象。

B.对任何对象x,有x.clone() .getClass = = x.getClass。克隆对象与原始对象的类型相同。

C.如果对象xequal方法定义得当的话,x.clone().equal(x)应当成立。

equal()方法讨论:

当两个变量指向同一个对象时,equal()方法返回true.。被克隆对象按照其内部状态是否可变分为可变对象和不可变对象,不可变对象和可变对象提供的equal()方法的工作方式应当是不同的。

可变对象只有他们是同一个对象时,equal()方法才返回true,所以这样的对象可以直接从Object类继承。不变对象必须含有相同的状态才可能满足这个条件,所以不变类型必须自己实现这个equal()方法。String类的对象属于不变对象。

原始模型的表现形式

原始模型有两种表现形式:简单形式和登记形式。

简单形式的原始模型的三种角色:

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

抽象原型(Prototype)角色:此角色给出所有的具体类型所需的接口。

具体原型(Concrete Prototype):被复制的对象,此角色需要实现抽象的原型角色所要求的接口。

简单原始模型的类图如下:

简单形式

登记形式的原始模型模式的四种角色:

客户端角色:客户端向管理员提出创建对象请求。

抽象原型角色:与简单形式模型一样。

具体原型角色:与简单形式模型一样。

原型管理器(Prototype Manager)角色:创建具体原型类的对象,并记录每个被记录的对象。

登记式原始模型的类图如下:

登记式

两种模式的比较:

A.如果需要创建的原型对象数目比较少而且比较固定的话,可以用简单原始模型。由客户端自己保存原型对象的引用。

B.如果创建原型对象的数目不固定的话,采用登记式的原型对象,客户端不用保存对原型对象的引用,交给管理员来做。在复制一个对象之前,客户端可以查看管理员对象是否已经有一个满足要求的原型对象,如果有可以直接获取对象的引用,如果没有则自己创建。

在什么情况下使用原始模型

如果一个系统的产品类是动态加载的,且具有一定的等级结构,这个时候可以采用工厂模式。但是产品类的等级结构一旦发生变化,工厂类的等级结构就必须有一个相应的变化。这时采用原始模型,给每个产品配备一个clone()方法,便可以避免使用工厂模式所带来的具有固定等级结构的工厂类。

一个使用原始模式的系统与它的产品对象是怎么创建出来的,以及这是产品对象之间的结构是怎么样的,以及这个结构会不会发生变化是没有关系的。

原始模型的优缺点

(1)原始模型允许动态加载或减少产品类。

(2)原始模式提供简化的创建模式。

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

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

原始模型的主要缺点就是,每个类都必须有一个克隆方法。

参考文献:《Java与模式》,阎宏,第二十章,原始模型模式。

 

0
0
分享到:
评论
2 楼 xiandaoyan 2011-10-01  
你的equals方法定义了吗?怎么定义的啊?
1 楼 zhaozengfengw 2010-12-22  
C.如果对象x的equal方法定义得当的话,x.clone().equal(x)应当成立。

这方法执行 返回false


ClientDemo ClientDeamo = new ClientDemo();
boolean res = false;
try {
res = ClientDeamo.clone().equals(ClientDeamo);
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.print(res);

    @Override
    public ClientDemo clone() throws CloneNotSupportedException {
        return (ClientDemo)super.clone();
    }

相关推荐

Global site tag (gtag.js) - Google Analytics