zoukankan      html  css  js  c++  java
  • 原型模式应用——展现每日生活

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

    二 模式举例
    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方法
    	 */
    	@Override
    	public 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对象,然后返回
    	 */
    	@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;
    	}
    }

     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 同一个对象可能会供其他调用者同时调用访问时

  • 相关阅读:
    【Java】推断文件的后缀名
    UVa 131
    Java开发手冊 Java学习手冊教程(MtJava开发手冊)
    《Java并发编程实战》第十五章 原子变量与非堵塞同步机制 读书笔记
    OC语言--NSFileManager& NSFileHandle
    为什么我刚发表的文章变成了“待审核”,csdn有没有官方解释啊
    mac os升级为 Yosemite 10.10 后不能创建javaproject
    【spring】在spring cloud项目中使用@ControllerAdvice做自定义异常拦截,无效 解决原因
    【mybatis】mybatis动态order by 的问题, 注意 只需要把#{} 改成 ${} 即可
    【spring cloud】一个ms微服务想要给注册中心eureka发现,需要满足这些条件,微服务不能被eureka注册中心发现的解决方案
  • 原文地址:https://www.cnblogs.com/ainima/p/6331658.html
Copyright © 2011-2022 走看看