面向对象:原型(Prototype)模式

以下内容来自http://www.lifevv.com/sysdesign/index.html

 

Prototype模式的概念

Prototype模式是一种对象创建型模式,它跟工厂模式,Builder模式等一样,都用来创建类的实例对象。
但Prototype模式的对象创建方法,具有以下特点:
- 由原型对象自身创建目标对象。也就是说,对象创建这一动作发自原型对象本身。
- 目标对象是原型对象的一个克隆。也就是说,通过Prototype模式创建的对象,不仅仅与原型对象具有相同的结构,还与原型对象具有相同的值。
- 根据对象克隆深度层次的不同,有浅度克隆与深度克隆。

有关Java语言克隆技术的描述,请参考:
Java语言的克隆与深层次克隆技术入门与精通
一文。

简单一点说,
Prototype模式提供一种方法,让类的对象可以实现对自身的复制。

Prototype模式的应用场景:

- 在创建对象的时候,我们不只是希望被创建的对象继承其基类的基本结构,还希望继承原型对象的数据。
- 希望对目标对象的修改不影响既有的原型对象(深度克隆的时候可以完全互不影响)。
- 隐藏克隆操作的细节。很多时候,对对象本身的克隆需要涉及到类本身的数据细节。

现实生活中,就有许多这样的例子:
生物细胞的自身复制;根据产品模型生产产品等等

Prototype模式的模型定义:


Prototype {
    +clone():Prototype
}
即:原型类Prototype 提供clone()方法,实现对对象自身的复制(克隆)。
UML类图:

Prototype模式的实现范例

下面我们使用Prototype模式来实现细胞(Cell)的自身复制过程。
Java语言提供了对象复制的机制,Prototype模式的Java实现一般也通过实现Cloneable接口来实现。
这里我们也通过实现Cloneable接口来说明Prototype模式。

<script src="http://www.lifevv.com/images/code/js/shCore.js" type="text/javascript"></script> <script> <!--// function _syboos_pmplat_setUpCode() { //dp.SyntaxHighlighter.ClipboardSwf = 'js/clipboard.swf'; dp.SyntaxHighlighter.HighlightAll('_syboos_pmplat_code'); } window.οnlοad=_syboos_pmplat_setUpCode; //--> </script> <script src="http://www.lifevv.com/images/code/js/shBrushJava.js" type="text/javascript"></script>
  1. public   class  Cell  implements  Cloneable {  
  2.     //细胞壁   
  3.     private  String cellWall;  
  4.     //细胞膜   
  5.     private  String cellMembrane;  
  6.     //细胞组织   
  7.     private  String cellularTissue;  
  8.   
  9.     ...//这里省略掉了对成员变量的setter/getter方法的定义   
  10.   
  11.     //细胞的自身复制   
  12.     //这里重载了Obect#clone()方法,为了方便外部调用,把返回值由Object修改为Cell,并把访问级别设置为public   
  13. <strong>    public  Cell clone() {  
  14.         try  {  
  15.             //只需简单地调用super.clone();即可   
  16.             return  (Cell) super .clone();  
  17.         } catch  (CloneNotSupportedException e) {  
  18.             throw  ( new  InternalError(e.getMessage()));  
  19.         }  
  20.     }  
  21. </strong>  
  22. }  
  23.   
  24. //调用方:   
  25. public   class  Client {  
  26.     public   static   void  main(String[] args) {  
  27.         //准备原型细胞   
  28.         Cell cell = new  Cell();  
  29.         cell.setCellWall("cell wall 1" );  
  30.         ...  
  31.         //克隆原型细胞   
  32.         Cell clonedCell = cell.clone();  
  33.         ...  
  34.         //操作被克隆的细胞(略)   
  35.     }  
  36. }  
public class Cell implements Cloneable {
    //细胞壁
    private String cellWall;
    //细胞膜
    private String cellMembrane;
    //细胞组织
    private String cellularTissue;

    ...//这里省略掉了对成员变量的setter/getter方法的定义

    //细胞的自身复制
    //这里重载了Obect#clone()方法,为了方便外部调用,把返回值由Object修改为Cell,并把访问级别设置为public
    public Cell clone() {
        try {
            //只需简单地调用super.clone();即可
            return (Cell)super.clone();
        } catch (CloneNotSupportedException e) {
            throw (new InternalError(e.getMessage()));
        }
    }


}

//调用方:
public class Client {
    public static void main(String[] args) {
        //准备原型细胞
        Cell cell = new Cell();
        cell.setCellWall("cell wall 1");
        ...
        //克隆原型细胞
        Cell clonedCell = cell.clone();
        ...
        //操作被克隆的细胞(略)
    }
}



这里使用了一个简单的例子说明了Prototype模式的对象创建过程与方法。里面省略了某些无关紧要的代码。

有关对象的克隆与深度克隆的详细描述,我们在 Java语言的克隆与深层次克隆技术入门与精通 一文中作了详细描述,请加以参考。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值