通过一个原型对象克隆出多个一模一样的对象,称为原型模式(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、深克隆:
无论是值类型还是引用类型都讲复制一份给克隆对象
四、原型管理器的引入和实现
管理多个原型对象
五、原型模式的总结:
- 主要优点:
- 创建型对象较为复杂时,使用原型模式可以简化创建过程
- 扩展性较好
- 原型模式提供了简化的创建结构
- 可以使用深克隆的方式保存对象的状态
- 主要缺点:
- 需要为每一个类配备一个克隆方法,且位于一个类的内部,违反了开闭原则
- 代码复杂
- 适用场景
- 创建型对象成本较大
- 如果系统要保存对象的状态而对象的状态变换很小
- 需要避免适用分层次的工厂类来创建分层次的对象,并且类的实力对象只有一个或很少的几个组合状态,通过复制原型对象得到新实例可能比适用构造函数创建一个新实