(文章翻译自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. POJ--2289--Jamie&#39;s Contact Groups【二分图的多个匹配+二分法答案】

    链接:id=2289">http://poj.org/problem?id=2289 意甲冠军:有n个人,m个分组,每一个人能够分配到一些组别.问怎样分能使得人数最多的组别人数最少. ...

  2. hdu2571命

    称号: Problem Description 穿过幽谷意味着离大魔王lemon已经无限接近了! 可谁能想到,yifenfei在斩杀了一些虾兵蟹将后.却再次面临命运大迷宫的考验.这是魔王lemon设下 ...

  3. Docker container communication with ovs

    2台宿主机,192.168.11153,192.168.1.154 安装OVS rpm -ivh openvswitch-2.4.0-1.x86_64.rpm #预先下载的 配置OVS 1. 按照上一 ...

  4. RS-232协议和RS-485协议

    RS232 RS232是一种异步传输标准接口.通常 RS-232 接口以9个引脚 (DB-9) 或是25个引脚 (DB-25) 的型态出现 .RS232最经常使用的连接方式是三根线:一条发送线.一条接 ...

  5. 前端插件@user

    分享一个 @user 前端插件   开源地址:https://github.com/yuezhongxin/Mention.js 插件效果:类似于微博或 github 中 @user 列表效果. 这是 ...

  6. Andriod Studio科普文章——3.大约gradle常见问题插头

    1.andriod gradle插件版本号过低. 错误位置: dependencies{ classpath 'com.android.tools.build:gradle:0.10.2' } 提示信 ...

  7. Angularjs,WebAPI 搭建一个简易权限管理系统

    Angularjs,WebAPI 搭建一个简易权限管理系统 Angularjs名词与概念(一)   1. 目录 前言 Angularjs名词与概念 权限系统原型 权限系统业务 数据库设计和实现 Web ...

  8. Javascript 继承 call与prototype

    function Parent(hello){ this.hello = hello; this.sayHello = function(){ alert(this.hello); } } Paren ...

  9. crawler_URL编码原理详解

    经常写爬虫的童鞋,难免要处理含有中文的url,大部分时间,都知道url_encode,各个语言也都有支持,今天简单整理下原理,供大家科普 1.特征: 如果URL中含有非ASCII字符的话, 浏览器会对 ...

  10. 如何利用【百度地图API】,制作房产酒店地图?(下)——结合自己的数据库

    原文:如何利用[百度地图API],制作房产酒店地图?(下)--结合自己的数据库 摘要:应广大API爱好者要求,写了一篇利用自己数据库标点的文章…… -------------------------- ...