设计模式那点事读书笔记(4)----原型模式

建造者模式: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

解决什么问题:

  某些结构复杂的对象”的创建工作,由于需求的变化,这些对象经常面临着剧烈的变化,但是他们却拥有比较稳定一致的接口.

UML:

  

代码结构:

  

被拷贝的对象:

package com.prototype.pojo;

/**
 * 被拷贝的对象
 */
public class DayLife implements Cloneable {
    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());
    }

    @Override
    public DayLife clone() {
        try {
            return (DayLife) super.clone();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

被抽象的工厂:

package com.prototype.factory;

import com.prototype.pojo.DayLife;

/**
 * 被抽象的工厂
 */
public interface ILifeFactory {
    DayLife getInstance();
}

工厂实现类:

package com.prototype.factory;

import com.prototype.pojo.DayLife;

/**
 * 工厂实现类
 */
public class LifeFactoryImpl implements ILifeFactory {
    // 必须用静态变量来标明对象
    private static DayLife dayLife = null;

    @Override
    public DayLife getInstance() {
        if (dayLife == null) {
            System.out.println("New Day Life");
            dayLife = new DayLife();
            dayLife.setGetUp("7:00起床");
            dayLife.setByBus("7:30坐公交上班");
            dayLife.setGetFood("8:30到公司,在公司附近吃早点");
            dayLife.setNoon("吃中饭");
            dayLife.setAfternoonWork("13:00开始下午工作");
            dayLife.setGoHome("18:00下班");
            dayLife.setNight("晚上娱乐");
        } else {
            System.out.println("Clone Day Life");
            dayLife = dayLife.clone();
        }
        return dayLife;
    }
}

拷贝实现:

package main;

import com.prototype.factory.ILifeFactory;
import com.prototype.factory.LifeFactoryImpl;
import com.prototype.pojo.DayLife;

/**
 * Created by Administrator on 2016/8/10.
 */
public class MainApp {
    public static void main(String[] args) {
        ILifeFactory factory = new LifeFactoryImpl();
        factory.getInstance().print();

        System.out.println("-----------------------");
        DayLife dayLife = factory.getInstance();
        dayLife.setGetUp("7:30起床");
        dayLife.print();

        System.out.println("-----------------------");
        DayLife dayLife2 = factory.getInstance();
        dayLife2.setGetUp("8:00起床");
        dayLife2.print();
    }
}
时间: 2024-12-21 03:28:42

设计模式那点事读书笔记(4)----原型模式的相关文章

设计模式那点事读书笔记(3)----建造者模式

建造者模式: 建造者模式是将复杂的对象构造进行分离,使得每个部件完成比较独立的工作.通过抽象类,接口来约束建造的过程. 解决什么问题: 当生成的产品对象内部具有复杂的结构. 当复杂对象需要与表示分离,可能需要创建不同的表示时. 当需要向客户隐藏产品内部结构表现时. UML: 代码结构: 商品的实体: package com.demo.builder.model; /** * 产品实体 */ public class MobilePackage { private float money; pri

大话设计模式读书笔记--6.原型模式

简单的复制粘贴极有可能造成重复代码的灾难, 但是java中提供了克隆的功能, 如果一个对象创建过程复杂,又要频繁使用, 在初始化信息不发生变化的情况下,应当采取克隆而不是new一个对象 定义 原型模式: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 也就是说, 只需知道原型对象的类型,就可以拷贝, 拷贝分为浅拷贝和深拷贝,可参考浅拷贝和深拷贝 模式结构 Prototype: 抽象原型类,声明克隆接口 ConcretePrototypeA: 具体的原型类, 实现克隆操作 模式实现

设计模式那点事读书笔记(2)----抽象工厂模式

抽象工厂模式: 此模式提供了一个接口,用于创建相关或者依赖对象的家族,而不需要指定具体实现类. 解决什么问题: 抽象工厂模式允许客户在使用抽象接口来创建一组相关的产品,客户类和工厂类分开,客户需要任何产品的时候,只需要向工厂请求即可,客户无须修改就可以获得新产品.从而实现客户从具体的产品中解耦. UML: 代码结构: 代码: 定义抽象产品: package com.demo.factory.model; /** * 抽象产品 */ public abstract class AbstractBa

设计模式那点事读书笔记(1)----工厂方法模式

工厂方法模式: 定义一个创建产品对象的工厂接口,让子类决定实例化哪种实例对象,将实际创建实例对象的工作推迟到子类当中,核心工厂类不再负责具体产品创建. 解决什么问题: 当子类型可能会有很多,以后需要不断添加不同子类的实现. 当一个系统尚在框架设计阶段,还不知道将来需要实例化那些具体类时. 系统设计之初不需要具体对象的概念. UML: 代码结构: 代码: 定义抽象产品: package com.demo.factory.model; /** * 定义抽象商品 */ public abstract

JavaScript设计模式与开发实践---读书笔记(7) 迭代器模式

迭代器模式是指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示. JavaScript中的Array.prototype.foreach. 1.JQuery中的迭代器 $.each函数 2.自己实现一个each函数 var each = function(ary,callback){ for(var i=0,l=ary.length;i<l;i++){ callback.call(ary[i],i,ary[i]);//把下标和元素当作参数传给callback函数 }

JavaScript设计模式与开发实践---读书笔记(5) 策略模式

策略模式的定义是:定义一系列的算法,把它们一个个封转起来,并且使它们可以相互替换. JavaScript版本的策略模式: 奖金系统: var strategies = { "S": function(salary){ return salary*4; }, "A": function(salary){ return salary*3; }, "B": function(salary){ return salary*2; } }; var calc

JavaScript设计模式与开发实践---读书笔记(9) 命令模式

命令模式的用途: 命令模式是最简单和优雅的模式之一,命令模式中的命令(command)指的是一个执行某些特定事情的指令. 命令模式最常见的应用场景是:有时候需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是什么.此时希望用一种松耦合的方式来设计程序,使得请求发送者和请求接收者能够消除彼此之间的耦合关系. 命令模式的例子-菜单程序: <!DOCTYPE html> <html lang="en"> <head> <met

JavaScript设计模式与开发实践---读书笔记(10) 组合模式

组合模式就是用小的子对象来构建更大的对象,而这些小的子对象也许是由更小的"孙对象"构成的. 组合模式将对象组合成树形结构,以表示"部分-整体"的层次结构. 抽象类在组合模式中的作用: 组合模式最大的优点在于可以一致地对待组合对象和基本对象.这种透明性带来的便利,在静态类型语言中体现的尤为明显. JavaScript中实现组合模式的难点在于要保证组合对象和叶对象拥有同样的方法,这通常需要用鸭子类型的思想对它们进行接口检查. 透明性带来的安全问题: 组合模式的例子-扫描

jQuery内核详解与实践读书笔记1:原型技术分解2

上一篇已经搭建了一个非常简陋的jQuery框架雏形,如没有阅读搭建过程,请先阅读<jQuery内核详解与实践读书笔记1:原型技术分解1>初始搭建过程.接下来,完成书中介绍的剩下三个步骤: 7. 延续--功能扩展 jQuery框架是通过extend()函数来扩展功能的,extend()函数的功能实现起来也很简单,它只是吧指定对象的方法复制给jQuery对象或jQuery.prototype对象,如下示例代码就为jQuery类和原型定义了一个扩展功能的函数extend(). 1 var $ = j