文档章节

结构型模式之六:享元模式

奋斗到天明
 奋斗到天明
发布于 2015/08/27 16:45
字数 401
阅读 20
收藏 0

享元模式用来减少内存使用,他所做的是尽可能的与其他类似的对象共享更多的数据。 

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;
  }
}

咖啡工厂,他只在需要的时候创建新咖啡

//The FlyweightFactory!
class CoffeeFactory {
  private HashMap flavors = new HashMap();
 
  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());
  }
}

检查下面的输出 ,咖啡被10台服务,但是只有两台被使用

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

以上文章翻译自: http://www.programcreek.com/2013/02/java-design-pattern-flyweight/

© 著作权归作者所有

共有 人打赏支持
奋斗到天明
粉丝 18
博文 112
码字总数 82707
作品 0
昌平
程序员
Java设计模式学习记录-享元模式

前言 享元模式也是一种结构型模式,这篇是介绍结构型模式的最后一篇了(因为代理模式很早之前就已经写过了)。享元模式采用一个共享来避免大量拥有相同内容对象的开销。这种开销最常见、最直...

纪莫
08/15
0
0
Android的设计模式-享元模式

前言 Android的设计模式系列文章介绍,欢迎关注,持续更新中: Android的设计模式-设计模式的六大原则 一句话总结23种设计模式则 创建型模式: Android的设计模式-单例模式 Android的设计模式...

四月葡萄
01/04
0
0
设计模式之7个结构型模式

结构型模式概述 结构型模式(Structural Pattern)描述如何将类或者对象结合在一起形成更大的结构,就像搭积木,可以通过简单积木的组合形成复杂的、功能更为强大的结构。 结构型模式概述 结构...

randy_shandong
2017/01/12
0
0
设计模式-实现对象的复用——享元模式

享元模式概述 当一个系统中运行时产生的对象数量太多, 将导致运行代价过高, 带来系统性能下降的问题. 享元模式: 运用共享技术有效的支持大量细粒度对象的复用. 系统只使用少量的对象, 而这些...

hell03W
2016/12/09
8
0
java结构型模式

结构型模式是描述如何将类对象结合在一起,形成一个更大的结构,结构模式描述两种不同的东西:类与类的实例。故可以分为类结构模式和对象结构模式。 在GoF设计模式中,结构型模式有: 1.适配...

就是小灰灰
2017/07/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JS:异步 - 面试惨案

为什么会写这篇文章,很明显不符合我的性格的东西,原因是前段时间参与了一个面试,对于很多程序员来说,面试时候多么的鸦雀无声,事后心里就有多么的千军万马。去掉最开始毕业干了一年的Jav...

xmqywx
今天
0
0
Win10 64位系统,PHP 扩展 curl插件

执行:1. 拷贝php安装目录下,libeay32.dll、ssleay32.dll 、 libssh2.dll 到 C:\windows\system32 目录。2. 拷贝php/ext目录下, php_curl.dll 到 C:\windows\system32 目录; 3. p...

放飞E梦想O
今天
0
0
谈谈神秘的ES6——(五)解构赋值【对象篇】

上一节课我们了解了有关数组的解构赋值相关内容,这节课,我们接着,来讲讲对象的解构赋值。 解构不仅可以用于数组,还可以用于对象。 let { foo, bar } = { foo: "aaa", bar: "bbb" };fo...

JandenMa
今天
1
0
OSChina 周一乱弹 —— 有人要给本汪介绍妹子啦

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子 :分享水木年华的单曲《中学时代》@小小编辑 手机党少年们想听歌,请使劲儿戳(这里) @须臾时光:夏天还在做最后的挣扎,但是晚上...

小小编辑
今天
21
5
centos7安装redis及开机启动

配置编译环境: sudo yum install gcc-c++ 下载源码: wget http://download.redis.io/releases/redis-3.2.8.tar.gz 解压源码: tar -zxvf redis-3.2.8.tar.gz 进入到解压目录: cd redis-3......

hotsmile
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部