设计模式之原型模式

原型模式(prototype)为创建型对象模式,它是用原型实例来指定创建对象的类型的,并通过拷贝这些原型来创建新的对象。也就是说,这次我们创建新的对象和以前创建对象的方法有些不同,以前创建新的对象是用new方法作用于类上来实现的,现在我们不这样做了,给定一个类的实例,我们通过克隆这个类的实例来创建新的实例,显然,这个类本身要有能够实现“克隆”机制的方法才行,这样用该类创建出的对象才能拥有“克隆”自己的能力。通过查看java API文档可知,Java语言本身具有克隆对象的能力,因为Java.lang.Object对象中有一个clone()方法,但是想用这个方法还要做一些事情,那就是要实现Cloneable接口,这里给个小例子:

 1 public class Test{
 2
 3     public static void main(String[] args){
 4         Clon clon=new Clon();
 5         clon.setStr("helloworld");
 6         Clon clon2=(Clon)clon.clone();
 7         System.out.println("clon.getClass()==clon2.getClass() ? "+(clon.getClass()==clon2.getClass()));
 8         System.out.println("clon==clon2 ? "+(clon==clon2));
 9         System.out.println("clon.getSub()==clon2.getSub() ? "+(clon.getSub()==clon2.getSub()));
10     }
11 }
12
13 class Clon implements Cloneable{
14     private String str=null;
15     private substance sub=new substance();
16     public void setStr(String str){
17         this.str=str;
18     }
19     public substance getSub(){
20         return sub;
21     }
22     public void printStr(){
23         System.out.println(str);
24     }
25     public Object clone(){
26         Clon to_clon=null;
27         try{
28             to_clon=(Clon)super.clone();
29         }catch(CloneNotSupportedException e){
30             System.out.println(e);
31         }finally{
32             return to_clon;
33         }
34     }
35 }
36 class substance{
37
38 }

运行结果如下:

clon.getClass()==clon2.getClass() ? true
clon==clon2 ? false
clon.getSub()==clon2.getSub() ? true

调用clone方法实现的复制是“浅拷贝”(浅克隆),也就是说克隆的不够彻底,被克隆出的对象中的变量和原来的对象中的变量有相同的值,但是克隆出的对象中的引用和原对象中的引用的指向是相同的,所以运行结果的最后一行clon.getSub()==clon2.getSub()为真,它们返回的引用的指向是同一个对象。这就是“浅克隆”,至于“深克隆”机制,请看java编程之java浅拷贝和深拷贝,在该节,我总结了一点东西。

现在我们知道了,原型模式就是利用克隆的方式去创建新的对象,那么,这种模式与其他创建型模式有什么不同呢?

我们知道,工厂模式中,工厂类和产品类具有一定的对应关系,工厂类的等级结构要随产品类的等级结构变化而变化;但当采用原型模式时就不会有这种变化,当进行产品扩展时,我们只需要新产品的原型实例就可以通过拷贝方式创建新的产品对象(虽然对象中的属性值是和原型相同的,但是拿到这个新的产品对象后,你可以利用对象的内部方法任意修改自己想要的属性值,例如运用setXXX()方法等)。从这点来说,原型模式比其他创建型模式更为灵活。例如上面的例子中,你只需执行Clon clon3=(Clon)clon.clone()就又创建一个新的对象,注意这里,我们并未用new关键字去创建对象,所有创建型模式的终极目标都是对new关键字应该放在什么地方进行探索和封装,以便设计出更具合理性的对象创建方法,以上是对原型模式的学习总结,不足之处,恳请批评指正。

时间: 2024-10-01 04:37:08

设计模式之原型模式的相关文章

【设计模式】——原型模式

原型模式(Prototype),用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 下图是原型模式的结构图: 原型模型其实就是一个对象再创建另外一个可定制的对象,而且不需任何创建的细节,我们来看看基本的原型模式代码. //原型类 class Prototype { private: string id; public: Prototype(string id) { this->id=id; } string GetId() { return id; } virtual Protot

大话设计模式_原型模式(Java代码)

原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 简单描述:即通过实现接口Cloneable重写方法clone(),使得创建新的拷贝对象不需要一个成员一个成员的重新复制,而且可以提高创建对象的效率 Java中要想实现拷贝使用clone()方法,类必须实现Cloneable接口,并且重写Object类中的clone()方法,调用父类的clone()方法即可实现浅复制 代码如下: WorkExperience类: 1 package com.longsheng.prototy

大话设计模式之原型模式

原型模式 定义: 用原型实例制定创建对象的种类,并通过拷贝这些原型,创建新的对象. 实质: 就是从一个对象在创建另一个可定制的对象,而且不需要知道任何创建的细节. 核心: (1).实现Cloneable接口,可以使用此接口的类上使用clone方法. (2).重写Object类中的clone方法,因为所有类的父类是Object类,Object有一个clone方法,作用是返回对象的一个拷贝,但是其作用域protected类型的,一般的类无法调用,因此,将clone改为public类型. 结构图: 代

深入浅出设计模式 ------ Prototype(原型模式)之深度克隆

继上篇深入浅出设计模式 ------ Prototype(原型模式)的浅克隆实现, 本文进入Prototype(原型模式)的进阶篇----深度克隆. 深度克隆 ---- 序列化方式实现 把对象写到流里的过程是序列化(Serilization)过程,而把对象从流中读出来的过程则叫做反序列化(Deserialization).写在流里的是对象的一个克隆(新的, 独立的), 而原对象仍存在于JVM内存模型里.因此, 以下代码采用序列化方式实现深度克隆. 第一步: 将上篇的代码做些许改动, 加入对象引用

C#设计模式(6)——原型模式(Prototype Pattern)

一.引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创建这样的类实例,这未免会增加创建类的复杂度和耗费更多的内存空间,因为这样在内存中分配了多个一样的类实例对象,然后如果采用工厂模式来创建这样的系统的话,随着产品类的不断增加,导致子类的数量不断增多,反而增加了系统复杂程度,所以在这里使用工厂模式来封装类创建过程并不合适,然而原型模式可以很好地解决这个问题,因为每个类实例都是相同的,当我们需要多个相同的类实例时,没必要每次都使

图解Java设计模式之原型模式

图解Java设计模式之原型模式 克隆羊的问题 原型模式 - 基本介绍 原型模式在Spring框架中源码分析 浅拷贝的介绍 深拷贝基本介绍 克隆羊的问题 现在有一只羊tom,姓名为 : tom,年龄为 :1,颜色为 :白色,请编写程序创建和tom羊属性完全相同的10只羊. 传统方式解决克隆羊的问题 package com.example.demo.prototype; public class Sheep { private String name; private int age; privat

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

1.初识原型模式 大家都知道连锁机构是现在灰常流行的商业模式,比如咖啡之翼,那么假设咖啡之翼要在长春新建立一个分店,所经营的产品和以前在其他的城市已经存在的店经营的产品差不多,那么面向对象开发的角度怎么解决这个问题呢?难道要重新的实例化一个咖啡之翼的店??这显然不太好吧,咖啡之翼里面经营的产品(假设是属性吧)都需要重新写,这就是在做大量的重复工作啊,这显然是不符合OO开发思想的.遇到这样的情况,并不是重新建立一个类来解决这样的问题,而是通过设计模式中的"原型模式"来解决这种问题.是这种

Java设计模式之原型模式

原型模式简介 原型模式实际上不算一种设计模式,应该说是一种技巧吧.当我们需要创建与已有对象一样的对象时,我们通常可以有两种容易想到的方法,一种是将已有对象指向另外一个重新创建的对象,如 //将old赋给new Object newObject=oldObject; 这种做法是相当于newObject还是指向oldObject的地址,也就是说,二者实际上是一样的,未来也是一样的,随便对哪个对象进行更改,二者都会保持一致,因为可以把它们看做两个相同的"指针":另外一种常见的做法是,重新创建

<六>读<<大话设计模式>>之原型模式

原型模式也是很简单的一种模式,对于java来说已经有相应的接口了(Cloneable).关于原型模式<<大话设计模式>>是以投放简历作为例子讲解的,即我要投放很多简历,其实每个简历都一样,所以只要我写好一份,其他的复制就行了,其实就是今天讲的原型模式,就是把要复制的类对象的属性复制到另外一个对象上(其实不是复制而是对象的引用改变). 原型模型:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 浅复制VS深复制 关于克隆有两个概念 浅复制:就是只复制值类型的字段,不能

设计模式之原型模式(c++)

问题描述 看到这个模式,很容易想到小时候看的<西游记>,齐天大圣孙悟空发飙的时候可以通过自己头上的 3 根毛立马复制出来成千上万的孙悟空, 对付小妖怪很管用(数量最重要). Prototype 模式也正是提供了自我复制的功能, 就是说新对象的创建可以通过已有对象进行创建.在 C++中,拷贝构造函数( Copy Constructor) 曾经是很对程序员的噩梦,浅层拷贝和深层拷贝的魔魇也是很多程序员在面试时候的快餐和系统崩溃时候的根源之一. 在GOF的<设计模式:可复用面向对象软件的基础&