您的位置:首页 > 其它

设计模式之五:原型模式—对象的克隆

2016-09-22 15:27 288 查看
通过一个原型对象克隆出多个一模一样的对象,称为原型模式(Prototype Pattern)

克隆后的对象对原对象独立,对克隆后的对象进行修改不对原对象产生影响

一、原型模式概述

原型模式结构包含以下三个角色

Prototype(抽象原型类):声明克隆方法的接口,是所有具体原型类的公共父类,可以是抽象类也可以是接口,甚至可以是具体实现类
ConcretePrototype(具体原型类):实现在抽象类型中声明的克隆方法,在克隆方法中返回一个克隆对象
Client类(客户类)

1)通用实现方法

创建新对象,将原对象参数传入
class ConcretePrototype implements Prototype{
private String attr;
public void setAttr(String attr){
this.attr=attr;
}
public String getAttr(){
return this.attr;
}
public Prototype clone(){
Prototype prototype =new ConcretePrototype();
prototype.setAttr(this.attr);
return prototype;
}
}

客户类中的使用:

Prototype obj1=new ConcretePrototype();
obj1.setAttr("sunny");
Prototype obj2=obj1.clone()

2)Java语言提供的clone()方法

class ConcretePrototype implements Cloneable{
...
public Prototype clone(){
Object object=null;
try{
object=super.clone();
}
catch (CloneNotSupportedException exception){
SYstem.err.println("Not support Cloneable");
}
return (Prototype)object;
}
...
}
客户类中使用:

Prototype obj1=new ConcretePrototype();
Prototype obj2=obj1.clone()

二、完整解决方案:

public WeeklyLog clone(){
Object obj=null;
try{
obj=super.clone();
return (WeeklyLog)obj;
}
catch(CloneNotSupportException e){
System.out.println("不支持复制");
return null;
}
}

三、浅克隆与深克隆

浅克隆与深克隆的区别在于是否支持对引用类型变量的复制
1、浅克隆:
原型对象的成员变量是值类型,将复制一份给克隆对象;如果原型对象的成员变量是引用类型,则将引用对象的地址复制一份给克隆对象
2、深克隆:
无论是值类型还是引用类型都讲复制一份给克隆对象

四、原型管理器的引入和实现

管理多个原型对象

五、原型模式的总结:

主要优点:

创建型对象较为复杂时,使用原型模式可以简化创建过程
扩展性较好
原型模式提供了简化的创建结构
可以使用深克隆的方式保存对象的状态

主要缺点:

需要为每一个类配备一个克隆方法,且位于一个类的内部,违反了开闭原则
代码复杂

适用场景

创建型对象成本较大
如果系统要保存对象的状态而对象的状态变换很小
需要避免适用分层次的工厂类来创建分层次的对象,并且类的实力对象只有一个或很少的几个组合状态,通过复制原型对象得到新实例可能比适用构造函数创建一个新实
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  设计模式