Chapter 9 原型模式

原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.
简单的说就是clone一个对象实例。使得clone出来的copy和原有的对象一模一样。
插一个简单使用clone的例子,如果一个对象内部有可变对象实例的话,public
API不应该直接返回该对象的引用,以防调用方的code改变该对象的内部状态。这个时候可以返回该对象的clone。 一般而言,我们要的clone应该是这样的。copy和原型的内容一样,但是又是彼此隔离的。即在clone之后,改变其中一个不影响另外一个。

原型模式分为浅复制和深复制,其中浅复制:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。深复制把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象。

class User {
String name;
int age;
}
class Account implements Cloneable {
User user;
long balance;
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}

我们之所以要深copy,是因为默认的实现提供的浅copy不是隔离的,换言之,改变copy的东西,会影响到原型的内部。比如例子中,改变copy的user的name,影响了原型。特别注意的是string是一种拥有值类型特点的特殊引用类型。
class User implements Cloneable {
String name;
int age;
@Override
public User clone() throws CloneNotSupportedException {
return (User) super.clone();
}
}
class Account implements Cloneable {
User user;
long balance;
@Override
public Account clone() throws CloneNotSupportedException {
Account account = null;
account = (Account) super.clone();
if (user != null) {
account.user = user.clone();
}
return account;
}
}

再来贴2个实例代码

一、浅复制:

package xiao;

class WorkExp{

private String workDate;

private String company;

public String getWorkDate() {

return workDate;

}

public void setWorkDate(String workDate) {

this.workDate = workDate;

}

public String getCompany() {

return company;

}

public void setCompany(String company) {

this.company = company;

}

}

class Resume implements Cloneable{

private String name;

private String sex;

private String age;

private WorkExp work;

public Resume(String name){

this.name = name;

work = new WorkExp();

}

public void setPerInfo(String sex,String age){

this.sex = sex;

this.age = age;

}

public void setWorkExper(String timeArea,String company){

work.setWorkDate(timeArea);

work.setCompany(company);

}

public void display(){

System.out.println(this.name+" "+this.sex+" "+this.age);

System.out.println(work.getWorkDate()+" "+work.getCompany());

}

public Object clone() throws CloneNotSupportedException {

return super.clone();

}

}

public class Hello {

public static void main(String[] args) throws Exception{

Resume a = new Resume("big bird");

a.setPerInfo("male", "20");

a.setWorkExper("1998-2006", "IT company");

Resume b = (Resume)a.clone();

b.setWorkExper("1998-2004", "YY company");

Resume c = (Resume)a.clone();

c.setPerInfo("female", "22");

c.setWorkExper("1998-2004", "ZZ company");

a.display();

b.display();

c.display();

}

}

输出:

big bird male 20
1998-2006 ZZ company
big bird male
20
1998-2004 ZZ company
big bird female 22
1998-2004 ZZ company

二、深复制:

package xiao;

class WorkExp implements Cloneable{
private String workDate;
private
String company;
public String getWorkDate() {
return
workDate;
}
public void setWorkDate(String workDate)
{
this.workDate = workDate;
}
public String getCompany()
{
return company;
}
public void setCompany(String company)
{
this.company = company;
}
public WorkExp clone() throws
CloneNotSupportedException {
return
(WorkExp)super.clone();
}
}
class Resume implements
Cloneable{
private String name;
private String sex;
private String
age;
private WorkExp work;
public Resume(String name){
this.name =
name;
work = new WorkExp();
}
public void setPerInfo(String
sex,String age){
this.sex = sex;
this.age = age;
}
public void
setWorkExper(String timeArea,String
company){
work.setWorkDate(timeArea);
work.setCompany(company);
}
public
void display(){
System.out.println(this.name+" "+this.sex+"
"+this.age);
System.out.println(work.getWorkDate()+"
"+work.getCompany());
}
public Resume clone() throws
CloneNotSupportedException {
Resume resume = null;
resume = (Resume)
super.clone();
if(work != null){
resume.work =
work.clone();
}
return resume;
}
}
public class Hello {

public static void main(String[] args) throws Exception{
Resume a = new
Resume("big bird");
a.setPerInfo("male",
"20");
a.setWorkExper("1998-2006", "IT company");
Resume b =
(Resume)a.clone();
b.setWorkExper("1998-2004", "YY company");
Resume c
= (Resume)a.clone();
c.setPerInfo("female",
"22");
c.setWorkExper("1998-2004", "ZZ
company");
a.display();
b.display();
c.display();
}
}

输出:

big bird male 20
1998-2006 IT company
big bird male 20
1998-2004 YY
company
big bird female 22
1998-2004 ZZ company

时间: 2024-10-12 11:27:11

Chapter 9 原型模式的相关文章

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

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

设计模式学习笔记(十三:原型模式)

1.1概述 用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象.这就是原型模式的定义. 在某些情况下,可能不希望反复使用类的构造方法创建许多对象,而是希望使用该类创建一个对象后,以该对象为原型得到该对象的若干个复制品.也就是说,将一个对象定义为原型对象,要求改原型对象提供一个方法,使该原型对象调用此方法可以复制一个和自己有完全相同状态的同类型对象,即该方法"克隆"原型对象得到一个新对象.原型对象和以它为原型"克隆"出的新对象可以分别独立地变化,也就是说,

原型模式

1.与工厂模式类似,都是创建对象的 2与工厂模式不同,原型模式是先创建好一个原型对象,然后通过clone原型对象来创建新的对象,这样就免去了类创建时重复的初始化操作 3.比较适合用于大对象的创建 4.原型模式.解决对象的重复利用,比如一个大对象很多成员有默认参数初始化他们需要很大的时间片,显然创建一个初始化一次是一种浪费, 原型模式就解决了这个问题,php 的clone 是直接吧那片内存拷贝过来,省去了很多时间 例子 假设init里面循环200次为成员赋值 传统编程方法: 原型模式:

设计模式--原型模式C++实现

原型模式C++实现 1定义 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 2类图 3实现 class Prototype { protected: Prototype(); public: virtual Prototype* Clone() const = 0; vitual ~Prototype() = 0; }; class PrototypeClass:public Prototype { public: PrototypeClass(); PrototypeClass

大话设计模式笔记 原型模式

原型模式(Prototype),用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需知道任何创建的细节. 基本类型与引用类型的区别于关系在efficient java. http://www.cnblogs.com/linkarl/p/4785329.html 浅复制:对象的引用仍然指向原来的对象 深复制:把引用对象的变量指向复制过的新对象 我认为一般深复制比较常用. package prototype; public

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

1.定义 原型模式属于一种创建型模式,与其他创建型模式不同,原型模式不是直接构造对象,而是通过复制一个已经存在的实例返回新的实例. 2.适用性 为何要拷贝而不直接生成?我的理解是有些时候直接构造实例花费比较大,比如在构造对象的时候需要做大量的数据库查询,这样如果构造许多类似的对象还重复地查询数据库则开销很大,很没效率.直接拷贝现有的实例,在需要情况下做一些小的修改会显得高效许多. 3.结构 Prototype: 声明一个克隆自身的接口 ConcretePrototype:实现一个克隆自身的操作

设计模式--原型模式

原型模式 Prototype Pattern 意图:使用原型实例定义/指定被创建对象种类/类型,通过拷贝原型实例创建新对象 应用场景: 1)当某个类指定在运行时实例化 2)减少子类数量 3)降低昂贵类型新对象创建成本 好处或缺点: 1)clone方法可能实现比较困难 2)不适用于含循环引用的类结构 类结构: 参与者:client ,Prototype,ConcretePrototype prototype:定义原型的行为 //关键代码 class Notification implements

《JAVA与模式》之原型模式

在阎宏博士的<JAVA与模式>一书中开头是这样描述原型(Prototype)模式的: 原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象.这就是选型模式的用意. 原型模式的结构 原型模式要求对象实现一个可以"克隆"自身的接口,这样就可以通过复制一个实例对象本身来创建一个新的实例.这样一来,通过原型实例创建新的对象,就不再需要关心这个实例本身的类型,只要实现了克隆自身的方法,就可以通过这个方法来获取新

设计模式之原型模式

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