设计模式之五:原型模式—对象的克隆
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、深克隆:
无论是值类型还是引用类型都讲复制一份给克隆对象
四、原型管理器的引入和实现
管理多个原型对象
五、原型模式的总结:
主要优点:
创建型对象较为复杂时,使用原型模式可以简化创建过程
扩展性较好
原型模式提供了简化的创建结构
可以使用深克隆的方式保存对象的状态
主要缺点:
需要为每一个类配备一个克隆方法,且位于一个类的内部,违反了开闭原则
代码复杂
适用场景
创建型对象成本较大
如果系统要保存对象的状态而对象的状态变换很小
需要避免适用分层次的工厂类来创建分层次的对象,并且类的实力对象只有一个或很少的几个组合状态,通过复制原型对象得到新实例可能比适用构造函数创建一个新实
克隆后的对象对原对象独立,对克隆后的对象进行修改不对原对象产生影响
一、原型模式概述
原型模式结构包含以下三个角色
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、深克隆:
无论是值类型还是引用类型都讲复制一份给克隆对象
四、原型管理器的引入和实现
管理多个原型对象
五、原型模式的总结:
主要优点:
创建型对象较为复杂时,使用原型模式可以简化创建过程
扩展性较好
原型模式提供了简化的创建结构
可以使用深克隆的方式保存对象的状态
主要缺点:
需要为每一个类配备一个克隆方法,且位于一个类的内部,违反了开闭原则
代码复杂
适用场景
创建型对象成本较大
如果系统要保存对象的状态而对象的状态变换很小
需要避免适用分层次的工厂类来创建分层次的对象,并且类的实力对象只有一个或很少的几个组合状态,通过复制原型对象得到新实例可能比适用构造函数创建一个新实
相关文章推荐
- PropertyChangeListener简单理解
- 什么是设计模式
- 设计模式之创建型模式 - 特别的变量问题
- 七、设计模式——装饰模式
- 设计模式总结
- 设计模式之创建型模式
- 浅谈设计模式的学习
- 设计模式---状态模式在web前端中的应用
- Ruby设计模式编程之适配器模式实战攻略
- 实例讲解Ruby使用设计模式中的装饰器模式的方法
- 设计模式中的模板方法模式在Ruby中的应用实例两则
- Ruby设计模式编程中对外观模式的应用实例分析
- 实例解析Ruby设计模式编程中Strategy策略模式的使用
- Ruby中使用设计模式中的简单工厂模式和工厂方法模式
- Ruby使用设计模式中的代理模式与装饰模式的代码实例
- 详解组合模式的结构及其在Ruby设计模式编程中的运用
- C# 设计模式系列教程-建造者模式
- C#编程中使用设计模式中的原型模式的实例讲解
- 使用设计模式中的工厂方法模式进行C#编程的示例讲解
- 实例解析C#设计模式编程中简单工厂模式的使用