文档章节

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

奋斗到天明
 奋斗到天明
发布于 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

没有更多内容

加载失败,请刷新页面

加载更多

EOS官方钱包keosd

EOS官方钱包的名称是keosd,它负责管理你的私钥,并且帮你进行交易的签名。 不过不幸的是,keosd钱包对普通用户并不友好,它是一个命令行程序,目前还没有像以太坊的mist那样的图形化界面,而...

汇智网教程
今天
25
0
ArrayList的实现原理以及实现线程安全

一、ArrayList概述 ArrayList是基于数组实现的,是一个动态的数字,可以自动扩容。 ArrayList不是线程安全的,效率比较高,只能用于单线程的环境中,在多线程环境中可以使用Collections.syn...

一看就喷亏的小猿
今天
31
0
Netty 备录 (一)

入职新公司不久,修修补补1个月的bug,来了点实战性的技术---基于netty即时通信 还好之前对socket有所使用及了解,入手netty应该不是很难吧,好吧,的确有点难,刚看这玩意的时候,可能都不知道哪里...

_大侠__
昨天
35
0
Django简单介绍和用户访问流程

Python下有许多款不同的 Web 框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Django。 Django是一个开放源代码的Web应用框架,由Python写成。 Django遵守BSD版权,初...

枫叶云
昨天
48
0
Spring Cloud Stream消费失败后的处理策略(四):重新入队(RabbitMQ)

应用场景 之前我们已经通过《Spring Cloud Stream消费失败后的处理策略(一):自动重试》一文介绍了Spring Cloud Stream默认的消息重试功能。本文将介绍RabbitMQ的binder提供的另外一种重试...

程序猿DD
昨天
24
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部