原始模型模式
来源:互联网 发布:java 获取今天凌晨 编辑:程序博客网 时间:2024/04/28 19:39
原始模型模式
原始模型模式,我认为也可以称为克隆模式,就是由一个完整的产品对象复制出另一个对象的模式。它也是对象的创建模式,但是只与原始对象有关,不需要工厂类。
原始模型模式最成功的应用之一就是Object类的clone方法,可能由于这种方法的存在,很多人没有意识到原始模型模式是一种特定的创建模式。但是,它的确是一种产生对象的模式,而且clone方法所实现的只是原始模型模式的一种情况。
原始模型模式的对象创建方式有两种,可以分别称为浅复制和深复制:浅复制就是从原对象复制出新的对象时,并不复制它的成员对象,即它的成员对象句柄所指向的还是原对象中的成员对象;深复制就是在新对象中,成员对象也是新的。
package prototype;
public interface Prototype ...{
public void printPart();
Object flatClone();
Object deepClone() throws Exception;
}
package prototype;
import java.io.*;
public class ConcretePrototype implements Prototype , Serializable...{
private Part part;
public ConcretePrototype() ...{
part = new Part();
}
public void printPart() ...{
System.out.println(part);
}
public Object flatClone() ...{
ConcretePrototype cp = new ConcretePrototype();
cp.part = this.part;
return cp;
}
public Object deepClone() throws Exception ...{
ByteArrayOutputStream bo = new ByteArrayOutputStream();
ObjectOutputStream oo = new ObjectOutputStream(bo);
oo.writeObject(this);
ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
ObjectInputStream oi = new ObjectInputStream(bi);
return (oi.readObject());
}
class Part implements Serializable ...{
}
}
package prototype;
public class Client ...{
public static void main(String[] args) throws Exception ...{
ConcretePrototype originate, cloned, deepCloned;
originate = new ConcretePrototype();
Thread.sleep(2000);
cloned = (ConcretePrototype)originate.flatClone();
deepCloned = (ConcretePrototype)originate.deepClone();
System.out.println(originate);
System.out.println(cloned);
System.out.println(deepCloned);
originate.printPart();
cloned.printPart();
deepCloned.printPart();
}
}
public interface Prototype ...{
public void printPart();
Object flatClone();
Object deepClone() throws Exception;
}
package prototype;
import java.io.*;
public class ConcretePrototype implements Prototype , Serializable...{
private Part part;
public ConcretePrototype() ...{
part = new Part();
}
public void printPart() ...{
System.out.println(part);
}
public Object flatClone() ...{
ConcretePrototype cp = new ConcretePrototype();
cp.part = this.part;
return cp;
}
public Object deepClone() throws Exception ...{
ByteArrayOutputStream bo = new ByteArrayOutputStream();
ObjectOutputStream oo = new ObjectOutputStream(bo);
oo.writeObject(this);
ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
ObjectInputStream oi = new ObjectInputStream(bi);
return (oi.readObject());
}
class Part implements Serializable ...{
}
}
package prototype;
public class Client ...{
public static void main(String[] args) throws Exception ...{
ConcretePrototype originate, cloned, deepCloned;
originate = new ConcretePrototype();
Thread.sleep(2000);
cloned = (ConcretePrototype)originate.flatClone();
deepCloned = (ConcretePrototype)originate.deepClone();
System.out.println(originate);
System.out.println(cloned);
System.out.println(deepCloned);
originate.printPart();
cloned.printPart();
deepCloned.printPart();
}
}
下面是这段代码的打印:
prototype.ConcretePrototype@1034bb5
prototype.ConcretePrototype@19efb05
prototype.ConcretePrototype@723d7c
prototype.ConcretePrototype$Part@b162d5
prototype.ConcretePrototype$Part@b162d5
prototype.ConcretePrototype$Part@22c95b
prototype.ConcretePrototype@19efb05
prototype.ConcretePrototype@723d7c
prototype.ConcretePrototype$Part@b162d5
prototype.ConcretePrototype$Part@b162d5
prototype.ConcretePrototype$Part@22c95b
可以看出,打印的前三行各不相同,这说明通过浅复制和深复制,所得到的对象都是与原对象不同的;打印的后三行中有两行相同,这说明,在浅复制时,成员对象的实体没有被复制,只是复制了其句柄,而深复制时,成员对象的实体也被复制了。
- 原始模型模式
- 原始模型模式
- 设计模式之原始模型模式
- 《java与模式》-10 原始模型模式
- 原始模型(Prototype)模式学习笔记
- (C++设计模式) ------原始模型模式 Prototype -- 创建型模式
- 《Java与模式》选读“原始模型(Prototype)模式”
- 《java与模式》学习系列——原始模型模式
- 浅谈 java 设计模式--原始模型模式(Prototype pattern)
- 原始(prototype)模型模式之简单形式与登记形式
- 实例探索Java模式之路——原始模型
- Java 模式2(创建模式) - 建造模式,原始模型,JavaBean 的冷藏和解冻
- 原始事件模型
- 《Java与模式》学习笔记之八---原始模型模式(Prototype Pattern)
- 模式匹配的原始算法
- CPU的原始工作模式
- CPU的原始工作模式
- 创建模式中的原始(Prototype)模式
- C#条形码
- 软件生命周期模型及其选择(1)
- 如何寫性能測試用例
- 再听Beyond
- 英雄无敌3中我所喜爱的英雄
- 原始模型模式
- Document Object 与 TimeLine functions 与 场景元件 的关系
- 測試用例
- 測試報告
- 打印收集(打印成功!!!!)
- spring问题:初始化bean失败
- ControlDesigner - Accessing Web.Config at Design Time(转)
- 【源代码】数字图像处理部分源码
- ASP.NET Session详解