设计模式学习5——原型模式
来源:互联网 发布:python时间精确到毫秒 编辑:程序博客网 时间:2024/05/21 06:23
interface Prototype {public Prototype clone();public String getAttr();public void setAttr(String attr);}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;}}
class ConcretePrototype2 implements Prototype, Cloneable {@Overridepublic String getAttr() {// TODO Auto-generated method stubreturn null;}@Overridepublic void setAttr(String attr) {// TODO Auto-generated method stub}public Prototype clone() {Object object = null;try {object = super.clone();} catch (CloneNotSupportedException exception) {System.err.println("Not support cloneable");}return (Prototype)object;}}
特别注意:
public WeeklyLog clone() {Object obj = null;try {// 将对象写入流中ByteArrayOutputStream bao = new ByteArrayOutputStream();ObjectOutputStream oos;oos = new ObjectOutputStream(bao);oos.writeObject(this);// 将对象从流中读出来ByteArrayInputStream bis = new ByteArrayInputStream(bao.toByteArray());ObjectInputStream ois = new ObjectInputStream(bis);obj = ois.readObject();} catch (ClassNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return (WeeklyLog)obj;}
二、模式优缺点
主要优点:
<1>、当创建新的对象实例较为复杂时,使用原型模式可以简化对象的创建过程,通过复制一个已有实例可以提高新实例的创建效率。
<2>、扩展性较好,由于在原型模式中提供了抽象原型类,在客户端可以针对抽象原型类进行编程,而将具体原型类写在配置文件中,增加或减少产品类对原有系统都没有任何影响。
<3>、原型模式提供了简化的创建结构,工厂方法模式常常需要有一个与产品类等级结果相同的工厂等级结构,而原型模式就不需要这样,原型模式中产品的复制是通过封装在原型类中的克隆方法实现的,无须专门的工厂类来创建产品。
<4>、可以使用深拷贝的方式保存对象的状态,使用原型模式将对象复制一份并将其状态保存起来,以便在需要的时候使用(如恢复到某个历史状态),可辅助实现撤销操作。
主要缺点:
<1>、需要为每一个类配备一个克隆方法,而且该克隆方法位于一个类的内部,当对已有的类进行改造时,需要修改源代码,违背了“开闭原则”。
<2>、在实现深拷贝时需要编写较为复杂的代码,而且当对象之间存在多重的嵌套引用时,为了实现深拷贝,每一层对象对应的类都必须支持深拷贝,实现起来可能会比较麻烦。
三、适用场景
<1>、创建新对象成本较大,新的对象可以通过原型模式对已有对象进行复制来获得,如果是相似对象,则可以对其成员变量稍作修改。
<2>、如果系统要保存对象的状态,而对象的状态变化很小,或者对象本身占用内存较少时,可以使用原型模式配合备忘录模式来实现。
<3>、需要避免使用分层次的工厂类来创建分层次的对象,并且类的实例对象只有一个或很少的几个组合状态,通过复制原型对象得到新实例可能比使用构造函数创建一个新实例更加方便。
四、案例分析
- 设计模式学习05—原型模式
- 设计模式学习5——原型模式
- 设计模式5——原型模式
- 设计模式—原型模式
- 设计模式—原型模式
- 设计模式—原型模式
- 设计模式—原型模式
- 设计思想学习—原型模式
- 设计模式学习总结(5) 原型模式
- 设计模式学习--原型
- 设计模式学习(八)————原型模式
- 大话设计模式学习(七)——原型模式
- 设计模式学习笔记——原型模式
- 学习设计模式之禅——原型模式
- 设计模式学习笔记——原型模式
- python 设计模式学习 —— 原型模式
- 设计模式学习笔记——原型模式
- Java设计模式学习04——原型模式
- 第十五周项目五链接字符串
- 堆和栈理论以及程序内存分配
- Service启动demo
- const(一):(转) 一个函数名后面加const表示什么意思
- LeetCode 165. Compare Version Numbers
- 设计模式学习5——原型模式
- 安卓辅助功能 滴滴自动刷单
- 【HTML5】IIC
- 小白笔记-------------------------------leetcode(169. Majority Element)
- 设计模式随笔-状态模式
- RxJava使用入门(二)
- 解决拷贝的虚拟机网卡配置不正确的问题
- Swift中函数的默认值
- C++中const类型(二)----常指针和常引用