软件设计模式

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

原型模式-实例三
/** * 工厂实现类 */ public class LifeFactoryImpl implements ILifeFactory { // DayLife对象实例用于初始化 private static DayLife dayLife = null; /** * getNewInstance方法实现: * * 首先判断dayLife是否为null: * 如果是null,则使用new创建一个DayLife对象,同时设置初始内容,然后赋值给dayLife 对象实例,然后返回; * 如果不是null,则使用dayLift的clone方法产生一个新对象并复制给dayLife对象,然后返 回 */ @Override }
原型模式的时序图
原型模式-实例一
如果实例化一个类要花大量的时间,原型模
式是最好的解决方法。 Word采用的Copy-Paste生成的多个笑脸对象, 采用的极有可能是原型模式。
原型模式-实例一
原型模式-实例二
假设现在有一个工具栏,工具栏上 有很多图形对象。 当用户点击工具栏上的一个对象的 时候,图形就会显示在屏幕上。 我们设计的应用程序框架应该能够 很容易扩展,能够很容易增加新的
原型模式-实例三
public void setNight(String night) { this.night = night; } /** * 打印输出日常生活信息 */ public void print() { System.out.println(this.getGetUp()); System.out.println(this.getByBus()); System.out.println(this.getGetFood()); System.out.println(this.getNoon()); System.out.println(this.getAfternoonWork()); System.out.println(this.getGoHome()); System.out.println(this.getNight()); } /** * clone方法 */ @Override public DayLife clone() { try { // 调用超类的clone方法(超类?也没有集成任何类啊?哪里来的超类?别忘记了,所有类都是Object的子类哦!) return (DayLife) super.clone(); } catch (Exception e) { } return null; }
原型模式-实例二
原Fra Baidu bibliotek模式-实例二
package prototype; import java.util.*; public class ToolBar { public HashMap objPool; ToolBar() { objPool=new HashMap(); this.Register("circle",new Circle()); this.Register("rectangle",new Rectangle()); } public void Register(Object key,Object object) { objPool.put(key,object); } public Object getClone(String key) { return ((Prototype)objPool.get(key)).Clone(); } }
深复制:不但对原始数据类型做复制,对于
对象中的数组和对象引用也要做复制的行为, 从而达到将对象完全复制的效果
原型模式的应用场景
当要实例化的类是在运行时刻指定时,
例如, 通过动态装载.
为了避免创建一个与产品类层次平行
的工厂类层次时;
当一个类的实例只能有几个不同状态
组合中的一种时.建立相应数目的原型 并克隆它们可能比每次用合适的状态 手工实例化该类更方便一些.
第四讲 原型模式
原型模式
名称:原型模式(Prototype Pattern)
意图:用原型实例指定创建对象的种类,并
且通过拷贝这些原型实例创建新的对象。
原理:通过将一个原型对象传递给发动创建
动作的对象,该发动创建动作的对象通过请 求原型对象拷贝原型自己来实施创建过程。
原型模式的类图
原型模式的类图
// 再次获得DayLife,修改getUp内容后 输出内容 // System.out.println("------------------------"); // DayLife dayLife2 = lifeFactory.getNewInstance(); // dayLife2.setGetUp("早上赖床了!7::30才起床!"); // dayLife2.print(); } }
原型模式-实例二
原型模式的关键
原型模式的关键在于从一个现有的 对象复制一个新的对象; 原型对象的类必须提供Clone()方法;
Clone()可以分为浅层复制和深层复
制,采用浅层次的复制还是深层次的 复制会对我们的应用产生很大的影 响,需要特别注意.
原型模式的关键-浅层复制
原型模式的关键-浅层复制
原型模式-实例三
/** * 工厂实现类 */ public class LifeFactoryImpl implements ILifeFactory { // DayLife对象实例用于初始化 private static DayLife dayLife = null; /** * getNewInstance方法实现: * * 首先判断dayLife是否为null: * 如果是null,则使用new创建一个DayLife对象,同时设置初始内容,然后赋值给dayLife 对象实例,然后返回; * 如果不是null,则使用dayLift的clone方法产生一个新对象并复制给dayLife对象,然后返 回 */ @Override }
作业
采用原型模式实践拷贝-粘贴功能,并能
够十分容易地实现被复制的对象.
原型模式-实例三
原型模式的优势与缺陷
优势:在创建一个新的对象时, 如果初始化一个对象的
成本很大,那么采用原型模式能够节省初始化一个对象 的成本开销; 优势:可以在不知道具体的一个类的定义或实现时候,动 态的根据雷的实例创建一个类的实例; 增加了系统的灵 活性. 缺陷:实现深层次的复制的时候需要编写复杂的代码,对 开发者的要求较高.
原型模式-实例三
public DayLife getNewInstance() { // 判断dayLife是否为null if (dayLife == null) { // 如果为null // 输出是使用new 产生的对象。注意:new这个只使用一次哦! System.out.println(" new DayLife !"); // 设置dayLife内容 dayLife = new DayLife(); dayLife.setGetUp("7:00起床"); dayLife.setByBus("7:30坐公交车"); dayLife.setGetFood("8:30到公司附近的公交站下车,经过路旁的早餐车时会顺便买好早餐一起带到公司"); dayLife.setNoon("午餐在公司附近的小餐馆解决,然后在办公室的座椅上小憩一会"); dayLife.setAfternoonWork("13:30开始了下午的工作"); dayLife.setGoHome("17:30准时下班"); dayLife.setNight("晚上休闲娱乐"); } else { // 如果不为null // 输出是使用clone方法产生的对象 System.out.println(" clone DayLife !"); // 将clone对象赋值给dayLife ,返回 dayLife = dayLife.clone(); } return dayLife; }
原型模式的设计原则
考虑产生对象的复杂度和类复用
结合系统结构考虑使用浅复制还是深复制。
原型模式的注意事项
克隆对象时,原始对象的构造方法不被执行。
浅复制:浅复制只是复制本对象的原始数据
类型,如int, float, String等,对于数组和对 象引用等是不会复制的。因此,浅复制是由 风险的。
原型模式-实例三
原型模式-实例三
public class DayLife implements Cloneable { // 构造方法 public DayLife() { System.out.println("-- 执行构造方法了! --"); } // 起床 private String getUp; // 坐公交 private String byBus; // 下车,买早餐 private String getFood; // 中午小憩 private String noon; // 下午开始工作 private String afternoonWork; // 下班回家 private String goHome; // 晚上休闲 private String night; public String getGetUp() { return getUp; } public void setGetUp(String getUp) { this.getUp = getUp; } public void setGoHome(String goHome) { this.goHome = goHome; } public String getNight() { return night; }
图形对象。
原型模式-实例二
ToolBar可以看作是一个对象管理器 或者对象池,ToolBar里面存放了许 多对象; 当用户选择ToolBar上一个对象的时 候,ToolBar根据它所管理的对象克
隆一个新的对象返回; 创建ToolBar对象的时候,会自动创 建程序中所以可绘制的具体对象。
原型模式-实例二
原型模式-实例三
public class Client { public static void main(String[] args) { // 创建工厂 ILifeFactory lifeFactory = new LifeFactoryImpl(); // 打印输出DayLife默认内容 lifeFactory.getNewInstance().print(); // 再次获得DayLife,修改getUp内容后 输出内容 System.out.println("------------------------"); DayLife dayLife = lifeFactory.getNewInstance(); dayLife.setGetUp("早上赖床了!7::15才起床!"); dayLife.print();
原型模式-实例三
package com.prototype.factory;
import com.prototype.pojo.DayLife;
/** * 工厂类 */ public interface ILifeFactory { /** * 生产DayLife对象 * * @return */ public DayLife getNewInstance(); }
原型模式的关键-浅层复制
原型模式的关键-浅层复制
原型模式的关键-深层复制
原型模式的关键-深层复制
原型模式-实例三
原型模式-实例三
原型模式-实例三
上图中存在一个DayLife对象,代表主 人公的日常生活对象, 还有一个生产
DayLife的工厂Ifactory, 我们这样设 计:在改工厂中有一个静态的 DayLife对象dayLife, 设置为null值和 一个getNewInstance方法专门生产新 对象。
相关文档
最新文档