原型模式应用——展现每日生活

来源:互联网 发布:cctv5直播软件 编辑:程序博客网 时间:2024/06/08 17:29

一 模式定义
用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。

 

二 模式举例
1模式分析
我们借用每日上班情景耒说明这一模式。
2故事情节分析图


 
3原型模式静态建模


 
4代码示例
4.1原型建立

package com.prototype.pojo;/** * 日常生活类 *  * @author *  */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 String getByBus() {return byBus;}public void setByBus(String byBus) {this.byBus = byBus;}public String getGetFood() {return getFood;}public void setGetFood(String getFood) {this.getFood = getFood;}public String getNoon() {return noon;}public void setNoon(String noon) {this.noon = noon;}public String getAfternoonWork() {return afternoonWork;}public void setAfternoonWork(String afternoonWork) {this.afternoonWork = afternoonWork;}public String getGoHome() {return goHome;}public void setGoHome(String goHome) {this.goHome = goHome;}public String getNight() {return night;}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方法 */@Overridepublic DayLife clone() {try {// 调用超类的clone方法(超类?也没有集成任何类啊?哪里来的超类?别忘记了,所有类都是Object的子类哦!)return (DayLife) super.clone();} catch (Exception e) {}return null;}}

 4.2创建生成原型对象的抽象工厂

package com.prototype.factory;import com.prototype.pojo.DayLife;/** * 工厂类 *  * @author *  */public interface ILifeFactory {/** * 生产DayLife对象 *  * @return */public DayLife getNewInstance();}

 4.3创建生成原型对象的具体工厂

package com.prototype.factory.impl;import com.prototype.factory.ILifeFactory;import com.prototype.pojo.DayLife;/** * 工厂实现类 *  * @author *  */public class LifeFactoryImpl implements ILifeFactory {// DayLife对象实例用于初始化private static DayLife dayLife = null;/** * getNewInstance方法实现: *  * 首先判断dayLife是否为null: * 如果是null,则使用new创建一个DayLife对象,同时设置初始内容,然后赋值给dayLife对象实例,然后返回; * 如果不是null,则使用dayLift的clone方法产生一个新对象并复制给dayLife对象,然后返回 */@Overridepublic DayLife getNewInstance() {// 判断dayLife是否为nullif (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;}}

 4.4每日工作情景展现

package com;import com.prototype.factory.ILifeFactory;import com.prototype.factory.impl.LifeFactoryImpl;import com.prototype.pojo.DayLife;/** * 主应用程序 *  * @author *  */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();// 再次获得DayLife,修改getUp内容后 输出内容// System.out.println("------------------------");// DayLife dayLife2 = lifeFactory.getNewInstance();// dayLife2.setGetUp("早上赖床了!7::30才起床!");// dayLife2.print();}}

 运行结果

 new DayLife !
-- 执行构造方法了! --
7:00起床
7:30坐公交车
8:30到公司附近的公交站下车,经过路旁的早餐车时会顺便买好早餐一起带到公司
午餐在公司附近的小餐馆解决,然后在办公室的座椅上小憩一会
13:30开始了下午的工作
17:30准时下班
晚上休闲娱乐
------------------------
 clone DayLife !
早上赖床了!7::15才起床!
7:30坐公交车
8:30到公司附近的公交站下车,经过路旁的早餐车时会顺便买好早餐一起带到公司
午餐在公司附近的小餐馆解决,然后在办公室的座椅上小憩一会
13:30开始了下午的工作
17:30准时下班
晚上休闲娱乐

 

三 该模式的设计原刚
1 克隆对象时对象的构造方法不执行
2 浅复制和深复制

 

四使用场合
1 产生对彖的过程比较复杂,初始化需要许多资源
2 希望框架原型和产生对象分开时
3 同一个对象可能会供其他调用者同时调用访问时

原创粉丝点击