(文章翻译自Java Design Pattern: Flyweight)

享元模式用于最小化内存开销。它做的就是使用其他相似的对象尽可能多的分享数据。

1.享元模式类图

2.享元模式Java代码

// Flyweight object interface
interface ICoffee {
public void serveCoffee(CoffeeContext context);
}
// Concrete Flyweight object
class Coffee implements ICoffee {
private final String flavor; public Coffee(String newFlavor) {
this.flavor = newFlavor;
System.out.println("Coffee is created! - " + flavor);
} public String getFlavor() {
return this.flavor;
} public void serveCoffee(CoffeeContext context) {
System.out.println("Serving " + flavor + " to table " + context.getTable());
}
}
// A context, here is table number
class CoffeeContext {
private final int tableNumber; public CoffeeContext(int tableNumber) {
this.tableNumber = tableNumber;
} public int getTable() {
return this.tableNumber;
}
}

CoffeeFactory:它只是在需要的时候才会创建一个新的咖啡。

//The FlyweightFactory!
class CoffeeFactory { private HashMap<String, Coffee> flavors = new HashMap<String, Coffee>(); public Coffee getCoffeeFlavor(String flavorName) {
Coffee flavor = flavors.get(flavorName);
if (flavor == null) {
flavor = new Coffee(flavorName);
flavors.put(flavorName, flavor);
}
return flavor;
} public int getTotalCoffeeFlavorsMade() {
return flavors.size();
}
}

//服务员上咖啡

public class Waitress {
//coffee array
private static Coffee[] coffees = new Coffee[20];
//table array
private static CoffeeContext[] tables = new CoffeeContext[20];
private static int ordersCount = 0;
private static CoffeeFactory coffeeFactory; public static void takeOrder(String flavorIn, int table) {
coffees[ordersCount] = coffeeFactory.getCoffeeFlavor(flavorIn);
tables[ordersCount] = new CoffeeContext(table);
ordersCount++;
} public static void main(String[] args) {
coffeeFactory = new CoffeeFactory(); takeOrder("Cappuccino", 2);
takeOrder("Cappuccino", 2);
takeOrder("Regular Coffee", 1);
takeOrder("Regular Coffee", 2);
takeOrder("Regular Coffee", 3);
takeOrder("Regular Coffee", 4);
takeOrder("Cappuccino", 4);
takeOrder("Cappuccino", 5);
takeOrder("Regular Coffee", 3);
takeOrder("Cappuccino", 3); for (int i = 0; i < ordersCount; ++i) {
coffees[i].serveCoffee(tables[i]);
} System.out.println("\nTotal Coffee objects made: " + coffeeFactory.getTotalCoffeeFlavorsMade());
}
}

检查下面的结果输出,虽然有十个桌子需要咖啡可是只生产了两种咖啡。

Coffee is created! - Cappuccino
Coffee is created! - Regular Coffee
Serving Cappuccino to table 2
Serving Cappuccino to table 2
Serving Regular Coffee to table 1
Serving Regular Coffee to table 2
Serving Regular Coffee to table 3
Serving Regular Coffee to table 4
Serving Cappuccino to table 4
Serving Cappuccino to table 5
Serving Regular Coffee to table 3
Serving Cappuccino to table 3 Total Coffee objects made: 2

[译]ava 设计模式之享元的更多相关文章

  1. 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern)

    原文:乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) 作者:weba ...

  2. 设计模式:享元(FlyWeight)模式

    设计模式:享元(FlyWeight)模式 一.前言     享元(FlyWeight)模式顾名思义,既是轻量级的,原因就是享元,共享元素,这里的元素指的是对象.如何共享对象,那就是在检测对象产生的时候 ...

  3. python设计模式之享元模式

    python设计模式之享元模式 由于对象创建的开销,面向对象的系统可能会面临性能问题.性能问题通常在资源受限的嵌入式系统中出现,比如智能手机和平板电脑.大型复杂系统中也可能会出现同样的问题,因为要在其 ...

  4. 【GOF23设计模式】享元模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_享元模式.享元池.内部状态.外部状态.线程池.连接池 package com.test.flyweight; /** * ...

  5. 设计模式之享元模式(Flyweight)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  6. Head First设计模式之享元模式(蝇量模式)

    一.定义 享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能.这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式. ...

  7. 【Unity3D与23种设计模式】享元模式(Flyweight)

    GoF中定义: "使用共享的方式,让一大群小规模对象能更有效地运行" 享元模式一般应用在游戏角色属性设置上 游戏策划需要通过"公式计算"或者"实际测试 ...

  8. Java进阶篇设计模式之七 ----- 享元模式和代理模式

    前言 在上一篇中我们学习了结构型模式的组合模式和过滤器模式.本篇则来学习下结构型模式最后的两个模式, 享元模式和代理模式. 享元模式 简介 享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能 ...

  9. Java设计模式之七 ----- 享元模式和代理模式

    前言 在上一篇中我们学习了结构型模式的组合模式和过滤器模式.本篇则来学习下结构型模式最后的两个模式, 享元模式和代理模式. 享元模式 简介 享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能 ...

随机推荐

  1. axure7.0下载安装教程

    做产品必需要有原型设计.我们公司称为做demo. demo你能够用ppt做,或者直接做图片.这样给甲方基本通只是. 也能够直接用html做,这样非常慢.尽管真正研发时或许能够复用: 平衡的方案,也是最 ...

  2. 【cocos2d-js公文】十八、Cocos2d-JS v3.0物业风格API

    1. 新的API风格 我们直接来看看你能够怎样使用Cocos2d-JS v3.0: 曾经的API 新的API node.setPosition(x, y); node.x = x; node.y = ...

  3. WAP页面点击与hover延迟解决之道

    最近一直在WAP端页面的开发,一直都知道wap端点击相关问题存在延迟.之前做的网页大部分使用a链接进行,一直未入此坑. 最近做的一个WAP网站,各种点击,hover事件,如果使用PC端网页的做法,直接 ...

  4. 数组、链表、Hash(转)

    在程序中,存放指定的数据最常用的数据结构有两种:数组和链表. 数组和链表的区别: 1.数组是将元素在内存中连续存放. 链表中的元素在内存中不是顺序存储的,而是通过存在元素中的指针联系到一起. 2.数组 ...

  5. ASP.NET农历时间显示(两)

    在拍摄的月球时前(http://blog.csdn.net/yysyangyangyangshan/article/details/6802950),只是没有进行封装使用起来须要手动改动. 本次进行简 ...

  6. poj2593 Max Sequence(两个不相交字段的最大总和与)

    转载请注明出处:http://blog.csdn.net/u012860063? viewmode=contents 题目链接:id=2593">http://poj.org/prob ...

  7. Python - 缩写(capwords) 和 创建转换表(maketrans) 详细说明

    缩写(capwords) 和 创建转换表(maketrans) 详细说明 本文地址: http://blog.csdn.net/caroline_wendy/article/details/27051 ...

  8. IBM Java架构师的技能

    一天,群里飘过一个IBM招聘信息.我看过之后,也只是如此而已. 大家好!我是XXX,IBM招聘java架构师,如今还有38个名额 学历大专以上即可,英语能面试交流的.项目有非常多到时候依据您面试会详谈 ...

  9. XML概要

     早在两年前,我一直听说XML,但是,只是没有时间去研究它.也不知道它的作用,花了一些时间最近几天来学习他们的语言.是XML的一些简介希望能对各位同学有所帮助: XML是eXtensible Ma ...

  10. js:深闭包(范围:上)

    /**  * 范围封锁  */ fn1(); //fn1 您可以运行,没有报错,对于由function func_name()这样的写法来定义的函数,永远都会被最先初始化. function fn1( ...