Prototype设计模式

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

在软件开 发中,有时候可能会需要创建一些特别复杂的对象,如果系统中已经存在同样类型的对象,并且不同的属性个数相差不大的话,用Prototype模式可能是一 个理想的选择。

定义  :用原型 实例指定创建物件的种类,并且通过拷贝这些原型创建新的物件。

Prototype 模式允许一个物件再创建另外一个可定制的物件,根本无需知道任何如何创建的细节,工作原理是:通过将一个原型物件传给那个要发动创建的物件,这个要发动创 建的物件通过请求原型物件拷贝它们自己来实施创建。

类图如下:

Prototype


从图上可以看出,使用方法很简单,只要调用 对象的clone方法返回一个新的对象就可以了。但是为什么没有其他新的方法来实现这个模式呢?因为Java中的Object提供了clone()方法来 实现对象的克隆,所以Prototype模式实现一下子变得很简单.

在这个clone方法中,我们只要调用Object 的克隆方法返回一个对象,就可以以最简单的方式实现Prototype模式。

在其他编程语言中,就需要创建一个当前类的新的对 象,然后把当前对象本身的各属性的值复制一份给新创建的对象,并且返回新对象即可。


从上图中的main函数的调用过程来看,也 可以很清晰地看出Prototype模式和其他创建型模式的不同:Prototype模式创建对象不是通过new一个类,而是通过一个现有的对象实例来 的。

什么时候应该使用prototype模式呢?  
1.当你要创建的对象与现有运行时对象相 似度很大时
2.为了避免创建类的工厂类导致层次复杂度增加时
3.当类的实例只有不多的几种状态时(此时需要引进原型管理器)

Prototype 模式常用在一些对象管理器中。这些对象管理器本身一般为单例模式,主要负责对象的创建和返回。由于返回的对象的类型基本上是一致的,而且返回的对象的各项 属性大多保持一致,只有极少数属性才需要修改,所以用Prototype无疑是极好的选择。

需要注意的是:浅拷贝和深拷 贝的区别。

简单的讲,浅拷贝就是只对当前对象的直属属性进行复 制,如果其属性是基本类型的话,就复制原对象的值;如果其属性是其他对象的话,就复制对象的地址。而深拷贝则是麻烦的多,如果其属性是对象的话,就需要创 建一个新的子属性的对象,并且对这个对象的各项属性进行复制,如果子属性还有子属性的话,则需要递归的进行复制操作。

一切就看需求,如果那些属性的值不会被变更的话,那 么只需要实现浅拷贝即可;否则,深拷贝就是必须的。

ProtoType uml


Java代码
  1. package  com.kingswood.pattern.creational.protoType;    
  2.     
  3. public   interface  ProtoType  extends  Cloneable {    
  4.     
  5.     public  Object clone();    
  6.     
  7. }    
package com.kingswood.pattern.creational.protoType;  
  
public interface ProtoType extends Cloneable {  
  
    public Object clone();  
  
}  
 

Java代码
  1. package  com.kingswood.pattern.creational.protoType;    
  2.     
  3. public   class  ConcreteProtoType  implements  ProtoType {    
  4.     
  5.     private  String propA;    
  6.     
  7.     private  String propB;    
  8.     
  9.     public  String getPropA() {    
  10.         return  propA;    
  11.     }    
  12.     
  13.     public   void  setPropA(String propA) {    
  14.         this .propA = propA;    
  15.     }    
  16.     
  17.     public  String getPropB() {    
  18.         return  propB;    
  19.     }    
  20.     
  21.     public   void  setPropB(String propB) {    
  22.         this .propB = propB;    
  23.     }    
  24.     
  25.     public  Object clone(){    
  26.         try  {    
  27.             return   super .clone();    
  28.         } catch  (CloneNotSupportedException e) {    
  29.             return   null ;    
  30.         }    
  31.     }    
  32.     
  33. }   
package com.kingswood.pattern.creational.protoType;  
  
public class ConcreteProtoType implements ProtoType {  
  
    private String propA;  
  
    private String propB;  
  
    public String getPropA() {  
        return propA;  
    }  
  
    public void setPropA(String propA) {  
        this.propA = propA;  
    }  
  
    public String getPropB() {  
        return propB;  
    }  
  
    public void setPropB(String propB) {  
        this.propB = propB;  
    }  
  
    public Object clone(){  
        try {  
            return super.clone();  
        } catch (CloneNotSupportedException e) {  
            return null;  
        }  
    }  
  
} 
 

Java代码
  1. package  com.kingswood.pattern.creational.protoType;    
  2.     
  3. import  junit.framework.TestCase;    
  4.     
  5. public   class  Client  extends  TestCase {    
  6.     
  7.     public   static   void  testMethod(){    
  8.     
  9.         ConcreteProtoType proto = new  ConcreteProtoType();    
  10.     
  11.         proto.setPropA("propA" );    
  12.     
  13.         proto.setPropB("propB" );    
  14.     
  15.         ConcreteProtoType newProto = (ConcreteProtoType) proto.clone();    
  16.     
  17.         assertNotSame(proto, newProto);    
  18.     
  19.         assertEquals(proto.getPropA(), newProto.getPropA());    
  20.     
  21.         assertEquals(proto.getPropB(), newProto.getPropB());    
  22.     
  23.     }    
  24. }    
package com.kingswood.pattern.creational.protoType;  
  
import junit.framework.TestCase;  
  
public class Client extends TestCase {  
  
    public static void testMethod(){  
  
        ConcreteProtoType proto = new ConcreteProtoType();  
  
        proto.setPropA("propA");  
  
        proto.setPropB("propB");  
  
        ConcreteProtoType newProto = (ConcreteProtoType) proto.clone();  
  
        assertNotSame(proto, newProto);  
  
        assertEquals(proto.getPropA(), newProto.getPropA());  
  
        assertEquals(proto.getPropB(), newProto.getPropB());  
  
    }  
}  
 
以上样例使用浅克隆方式实现proto type模式,浅克隆无法对对象中包含的其他非java原是类型数据进行复制。如果需要复制其他非java原是类型数据,则需要使用深克隆方式,对象以及 其内部所有对象必须实现java.io.Serializable接口,clone方法改写成以下形式:


Java代码
  1. public  Object clone(){    
  2.     
  3.         try  {    
  4.     
  5.             ByteArrayOutputStream ot = new  ByteArrayOutputStream();    
  6.     
  7.             ObjectOutputStream oo = new  ObjectOutputStream(ot);    
  8.     
  9.             oo.writeObject(this );    
  10.     
  11.             ByteArrayInputStream it = new  ByteArrayInputStream(ot.toByteArray());    
  12.     
  13.             ObjectInputStream oi = new  ObjectInputStream(it);    
  14.     
  15.             return  (oi.readObject());    
  16.     
  17.         } catch  (IOException e) {    
  18.             e.printStackTrace();    
  19.             return   null ;    
  20.         } catch  (ClassNotFoundException e) {    
  21.             e.printStackTrace();    
  22.             return   null ;    
  23.         }    
  24.     
  25.     }   
c++实现设计模式——Prototype模式 c++实现设计模式——Prototype模式 什么是Prototype模式 Prototype模式提供了一个通过已存在对象进行新对象创建的接口(Clone),Clone()实现和具体的语言相关,在C++中通过拷贝构造函数实现。 结构图 为什么用Prototype模式 什么是Prototype模式,我相信网上有一堆的解释,但是我们要理解为什么要用,用了有什么好处,这才是最重要的,先说结论,什么场景下要用: 要创建很多个对象 每个对象属性很类似,只有少量区别,如果一个是鸡一个是. 阅读详情

相关推荐

设计模式Prototype(原型)

NULL 博文链接:https://wy649898543.iteye.com/blog/1431591

设计模式——Prototype模式

学习侯捷C++面向对象高级编程中Prototype模式。

m0_56391095的博客 1223

设计模式第8讲——原型模式(Prototype

原型模式属于创建型设计模式。 一、什么是原型模式 二、角色组成 三、优缺点 四、应用场景 4.1 生活场景 4.2 java场景 五、代码实现5.0 UML类图5.1 HeroSkill(英雄--具体原型类)5.2 StealManFactory(塞拉斯--客户端)5.3 TestPrototype六、总结

让~学习~成为一种习惯(橡 皮 人の技术博客) 4922

设计模式-Prototype模式(原型模式)

图解设计模式中的原型模式

weixin_44030848的博客 1386

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

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需知道任何创建的细节简单说就是先创建一个原型类实例,然后通过克隆的方法来复制一个一样的新对象,这个对象和原来的对象相同或相似核心:通过自带的Clone()方法和ICloneable接口创建跟该对象相同的新对象,不需要知道具体的创建细节。就是具有相同的属性和功能的对象的抽象的集合。类名称首字母大写。多个单词则各个首字母大写;对外公开的方法需要用‘public’修饰符。

一起加油吧~ 4461

23种设计模式-原型(Prototype)设计模式

23种设计模式-原型(Prototype)设计模式

Hanson的博客 2072

设计模式精解之——Prototype模式

0 引言0.1 目的       本文档给出设计模式之——Prototype模式的简化诠释,并给出其C++实现。0.2 说明ProjectDesign Pattern Explanation(By K_Eckel)AuthorizationFree Distributed but Ownership Reser

dadalan的专栏 1114

设计模式Prototype Pattern

摘自:《设计模式精解—GoF 23种设计模式解析附C++实现源码》 URL: http://www.mscenter.edu.cn/blog/k_eckel Prototype模式提供了一个通过已存在对象进行新对象创建的接口(Clone), Clone()实现和具体的语言相关,在C++中我们将通过拷贝构造函数实现之。 1 //Prototype.h 2 #ifndef _PROTO...

weixin_30410999的博客 118

设计模式Prototype模式

Prototype模式 ​ 根据实例原型,实例模型来生成新的实例 ,通过复制来生成实例 不指定类名的前提下生成实例 根据现有的实例来生成新的实例 clone Cloneable 出场角色 Prototype(原型) 定义用于复制现有实例来生成新实例的方法 ConcretePrototype(具体的原型) 实现复制现有实例并生成新实例的方法 Client(使用者) 使用复制...

PocketKnife 161

C++ 设计模式 (五) Prototype模式

<br />   作用:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。<br />   Prototype模式并不是简简单单一个clone方法,Prototype模式的意义在于动态抽取当前对象运行时的状态,同时通过提供统一的clone接口方法,使得客户代码可以在不知道对象具体类型时仍然可以实现对象的拷贝,而无需运用type-switch检测对象的类型信息来分别调用创建方法来创建一个新的拷贝。<br />  Prototype模式结构图:<br />   <br />下面给出一个例子,并不涉

zhuxiufenghust的专栏 688

[DP]Prototype设计模式

Prototype设计模式 深复制和浅复制 spring中的prototype

HeapStackk的博客 843

Prototype设计模式理解

Prototype设计模式理解。

weixin_46804076的博客 467

设计模式prototype

常见设计模式的解析和实现(C++)之四-Prototype模式 作用:<br />用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。<br /><br />UML结构图:<br /><br />抽象基类:<br />1)Prototype:虚拟基类,所有原型的基类,提供Clone接口函数<br /><br />接口函数:<br />1)Prototype::Clone函数:纯虚函数,根据不同的派生类来实例化创建对象.<br /><br />解析:<br />Prototype模式其实就是常说的

Not_Plain的专栏 526

C++设计模式Prototype

C++设计模式Prototype   2002-08-01· · ··COM集中营  一、功能    用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。    二、结构图   三、优缺点   优点:复制自身。客户不知道需要对象的实际类型,只需知道它的抽象基类即可。(即有继承树的

216

设计模式Prototype模式

在软件开发中,有时候可能会需要创建一些特别复杂的对象,如果系统中已经存在同样类型的对象,并且不同的属性个数相差不大的话,用Prototype模式可能是一个理想的选择。 定义:用原型实例指定创建物件的种类,并且通过拷贝这些原型创建新的物件。  Prototype 模式允许一个物件再创建另外一个可定制的物件,根本无需知道任何如何创建的细节,工作原理是:通过将一个原型物件传给那个要发

superbeck的专栏 2362

GOF设计模式——Prototype模式

一、什么是Prototype模式?         在编程中,我们可以使用new关键字指定类名来生成类的实例,但是有时候也会有不指定类名的前提下生成实例。因为有时候对象种类繁多,无法将它们整合到一个类中;或者,生成实例的过程过于复杂,难以根据类生成实例;又或者,想要将类与框架解耦。这时,为了能够在不使用类名的情况下生成实例,可以使用Prototype模式,Prototype模式又叫原型模式,专门...

weixin_39400271的博客 259

Prototype设计模式的实现

Prototype设计模式的实现Implementing the Prototype design Pattern       下载本文代码当我建立一个类的实例很复杂时,我们可以使用Prototype模式。与其建立很多类的实例,还不如进行适当的修改后,使用最初的实例的副本。使用Prototype模式,可以通过克隆一个原型,减少子类的数量。Prototype模式可以减少类的实例的数量

郭岩(guoyan19811021,吉祥)的专栏 1382

设计模式Prototype(c++)

Prototype模型: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象----克隆(clone)对象。

richerg85的专栏 2879

设计模式Prototype

Edidaughter的博客 206
上一篇: Struts2的REST插件
下一篇: 谈谈Unicode编码,简要解释 UCS、UTF、BMP、BOM等名词
ssh591
博客等级 码龄19年 5粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值