(文章翻译自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 arrayprivate static Coffee[] coffees = new Coffee[20];//table arrayprivate 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 3Total Coffee objects made: 2

转载于:https://www.cnblogs.com/zhangminghui/p/4214381.html

[译]ava 设计模式之享元相关推荐

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

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

  2. 北风设计模式课程---享元模式

    北风设计模式课程---享元模式 一.总结 一句话总结: 不仅要通过视频学,还要看别的博客里面的介绍,搜讲解,搜作用,搜实例 1.享元模式的本质是什么? 池技术:各种缓存池都是享元模式的体现 说到享元模 ...

  3. 结构设计模式 - Flyweight设计模式(享元设计模式)

    结构设计模式 - Flyweight设计模式 今天我们将研究Flyweight 设计模式,Flyweight设计模式又被称为 享元设计模式 . 目录[ 隐藏 ] 1 Flyweight设计模式 1.1 ...

  4. 每天一个设计模式之享元模式

    作者按:<每天一个设计模式>旨在初步领会设计模式的精髓,目前采用javascript和python两种语言实现.诚然,每种设计模式都有多种实现方式,但此小册只记录最直截了当的实现方式 :) ...

  5. 北风设计模式课程---享元模式与单例模式区别

    北风设计模式课程---享元模式与单例模式区别 一.总结 一句话总结: 不仅要通过视频学,还要看别的博客里面的介绍,搜讲解,搜作用,搜实例 1.享元模式与单例模式区别? 级别:单例模式是类级别的,一个类 ...

  6. .net设计模式 (享元模式)学习笔记

    运用设计模式只是为了解决一类问题的,当解决掉当前一类问题,通常会在解决这个问题时候 带来其他问题  合理应用扬长避短 结构性设计模式:关注的是类与类之间的关系 .net设计模式 (享元模式)学习笔记 ...

  7. Java设计模式之享元模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

  8. 详解设计模式:享元模式

    享元模式(Flyweight Pattern),是对象池的一种体现,也是 GoF 的 23 种设计模式中的一种结构型设计模式. 享元模式 主要用于减少创建对象的数量,以减少内存占用和提高性能.它提供了 ...

  9. 设计模式之享元模式详解

    设计模式之享元模式详解 概述 享元模式定义: ​ 运用共享技术来有效地支持大量细粒度对象的复用.它==通过共享已经存在的对象来大幅度减少需要创建的对象数量==.避免大量相似对象的开销,从而提高系统资源 ...

最新文章

  1. ECS控制台支持创建资源时绑定标签
  2. memcache及其telnet命令使用详解
  3. php递归函数return会出现无法正确返回想要值的情况
  4. 木马捆绑器设计思路和源码
  5. VBS 自动发送邮件
  6. Qt5中文乱码解决方案
  7. 列表框、下拉列表框或组合框与数据库
  8. Android中TextView中文字体粗体的设置方法
  9. Qt5.3.1环境变量配置-----gyy
  10. HIVE 实现均匀抽样
  11. jpress-项目升级
  12. ベルベット / 贝姐
  13. 解决 chrome 启动时强制打开2345导航(或其他网址)的方法
  14. 【 linux 从入门到放弃(全网最详细虚拟机及c7安装)】
  15. vue循环jq渲染网页页面
  16. BM发声,孙宇晨入场,国产公链集体进军DeFi
  17. 交换机进行syslog服务器设置
  18. Win10 去除OneNote 波浪下划线
  19. Molecular Psychiatry:海马及其相关网络在电休克抗抑郁中的机制研究
  20. 跨模态/多模态 cross-modal

热门文章

  1. 《LeetCode力扣练习》第39题 组合总和 Java
  2. php sql报错1054 in,sql语句拼接 报错
  3. python壁纸程序代码_python设置windows桌面壁纸的实现代码
  4. mysql merge union_MySQLMerge存储引擎
  5. js 将二进制流html导出excel,js 实现纯前端将数据导出excel
  6. C++知识点26——使用C++标准库(常用的泛型算法1)
  7. Linux发布环境,linux发布环境初始化脚本
  8. arraylist从大到小排序_初学Python最简易入门之十四排序算法10对字典排序
  9. java 定时_结合真实案例,清晰梳理几种定时任务的退出「JAVA并发」
  10. 使用 markdown-it 解析 markdown 代码(读 VuePress 三)