第五章_原型模式
1.介绍
1.1定义
原型模式是用于创建重复的对象,同时又能保证性能。
1.2解决的问题
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象
1.3使用场景
1.4应用实例
1.5角色
2.举例
-
浅克隆:创建一个新对象,新对象的属性和原来对象完全相同,对于非基本类型属性,仍指向原有属性所指向的对象的内存地址。
-
深克隆:创建一个新对象,属性中引用的其他对象也会被克隆,不再指向原有对象地址。
2.1案例之猴子复制(浅克隆)
2.1.1抽象原型类Object
2.1.2非基本类型属性类—金箍棒JingGu
public class JingGu{
public void show(){
System.out.println("我是金箍棒");
}
}
2.1.3具体原型类—猴子Monkey
public class Monkey implements Cloneable {
private JingGu jingGu=null;
public Monkey(){
this.jingGu=new JingGu();
}
@Override
public Object clone(){
Monkey cloneMonkey =null;
try {
cloneMonkey=(Monkey) super.clone();
}catch (CloneNotSupportedException e){
System.out.println("克隆失败!");
}
return cloneMonkey;
}
public JingGu getJingGu(){
return this.jingGu;
}
}
2.1.4客户端测试类—Client
public class Client {
public static void main(String[] args) {
Monkey monkey,copyMonkey;
monkey=new Monkey();
copyMonkey= (Monkey) monkey.clone();
System.out.println("monkey == copyMonkey?");
System.out.println(monkey == copyMonkey); //结果为false
System.out.println("monkey.getJingGu() == copyMonkey.getJingGu()?");
System.out.println(monkey.getJingGu() == copyMonkey.getJingGu()); //结果为true
}
}
2.2案例之猴子复制(深克隆)
2.2.1非基本类型属性类—金箍棒JingGu
public class JingGu implements Serializable{
public void show(){
System.out.println("我是金箍棒");
}
}
2.2.2具体原型类—猴子Monkey
public class Monkey implements Serializable {
private JingGu jingGu=null;
public Monkey(){
this.jingGu=new JingGu();
}
public Object deepClone() throws IOException,ClassNotFoundException, OptionalDataException{
//将对象写入流中
ByteArrayOutputStream bao=new ByteArrayOutputStream();
ObjectOutputStream oos =new ObjectOutputStream(bao);
oos.writeObject(this);
//将对象从流中取出
ByteArrayInputStream bis =new ByteArrayInputStream(bao.toByteArray());
ObjectInputStream ois =new ObjectInputStream(bis);
return (ois.readObject());
}
public JingGu getJingGu(){
return this.jingGu;
}
}
2.2.3客户端测试类—Client
public class Client {
public static void main(String[] args) {
Monkey monkey,copyMonkey;
monkey=new Monkey();
copyMonkey= (Monkey) monkey.clone();
System.out.println("monkey == copyMonkey?");
System.out.println(monkey == copyMonkey); //结果为false
System.out.println("monkey.getJingGu() == copyMonkey.getJingGu()?");
System.out.println(monkey.getJingGu() == copyMonkey.getJingGu()); //结果为false
}
}
通过结果可以看出,表达式( email==copyEmail)结果为false,即通过复制得到的对象与原型对象的引用不一致,
表达式( email.getAttachment()==copyEmail.getAttachment())结果也为false,
原型对象与克隆对象对成员对象的引用不相同,说明其成员对象也复制了一份。
3.优缺点
优缺点:原型模式最大的优点在于可以快速创建很多相同或相似的对象,简化对象的创建过程,还可以保存对象的一些中间状态。
其缺点在于需要为每一个类配备一个克隆方法,因此对已有类进行改造比较麻烦﹐需要修改其源代码,并且在实现深克隆时需要编写较为复杂的代码。
适用于:创建新对象成本较大,新的对象可以通过原型模式对已有对象进行复制来获得。系统要保存对象的状态,而对象的状态变化很小,需要避免使用分层次的工厂类来创建分层次的对象,并且类的实例对象只有一个或很少的几个组合状态,通过复制原型对象得到新实例可能比使用构造函数创建一个新实例更加方便。