(文章翻译自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. 对于C11中的正則表達式的使用

    Regular Expression Special Characters "."---Any single character(a "wildcard") & ...

  2. JavaScript高级编程

             原文地址: http://www.onlamp.com/pub/a/onlamp/2007/07/05/writing-advanced-javascript.html Web应用程 ...

  3. POSIX 螺纹具体解释(1-概要)

    线程是有趣的 线程类似于进程.如同进程,线程由内核按时间分片进行管理.在单处理器系统中,内核使用时间分片来模拟线程的并发运行.这样的方式和进程的同样. 而在多处理器系统中,如同多个进程.线程实际上一样 ...

  4. cocos2d-x由Jni实现Java与C++打电话给对方

    cocos2d-x由Jni实现Java与C++打电话给对方. cocos2d-x与开发商提供一个类JniHelper,提供java与c++之间的互jni解. 笔者所开发的"史上最坑爹的游戏& ...

  5. Gallatin(大陆版)Office365中Exchange Online混合部署功能已经能够使用了

    经过測试,Exchange混合部署已经能够使用了 前置条件: 本机至少须要一台Exchange Server 2013作为混合部署server 须要一个公网域名 domian.com,能够和内部域名不 ...

  6. EMVTag系列5《8E 持卡人验证方法(CVM)名单》

    L: var. up to 252 -R(需求):数据必须存在,在读应用数据过程中,终端不检查 依照优先顺序列出卡片应用支持的全部持卡人验证方法 注:一个应用中能够有多个CVM列表,比如一个用于国内交 ...

  7. 比ORA-24777: 我不使用不可移植数据库链接更郁闷的事情达成一致

    现场有一个同步误差,内容如下面:    java.sql.BatchUpdateException: ORA-24777: 不同意使用不可移植的数据库链路    at oracle.jdbc.driv ...

  8. Elasticsearch教程

    Elasticsearch教程 摘要: 参考资料Elasticsearch中文参考文档思维导图阅读全文 posted @ 2015-08-05 11:49 xingoo 阅读(18) | 评论 (0) ...

  9. tomcat如何避免遭遇ClassNotFoundException

    于Tomcat紧接着为什么要创建一个类加载器Thread.currentThread().setContextClassLoader(catalinaLoader)?这里加载失败主要是为了避免以后加载 ...

  10. oracle 11g 自己主动调整

    --:自己主动调教计划 begin   dbms_workload_repository.create_snapshot(); end; select /*+ result_cache */ coun ...