文档章节

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

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

没有更多内容

加载失败,请刷新页面

加载更多

原型模式

1、原型模式-定义 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 克隆(浅度克隆->拷贝值类型或者引用,深度克隆->创建新的对象,开辟新的内存) 例如客户端知道抽象Pro...

阿元
今天
52
0
awk命令扩展使用操作

awk 中使用外部shell变量 示例1 [root@centos01 t1022]# A=888[root@centos01 t1022]# echo "" | awk -v GET_A=$A '{print GET_A}'888[root@centos01 t1022]# echo "aaaaaaaaaaaaa" | aw......

野雪球
今天
47
0
深入解析MySQL视图VIEW

Q:什么是视图?视图是干什么用的? A:视图(view)是一种虚拟存在的表,是一个逻辑表,本身并不包含数据。作为一个select语句保存在数据字典中的。   通过视图,可以展现基表的部分数据;...

IT--小哥
今天
50
0
虚拟机学习之二:垃圾收集器和内存分配策略

1.对象是否可回收 1.1引用计数算法 引用计数算法:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时候计数器值为0的对象就是不可能...

贾峰uk
今天
50
0
smart-doc功能使用介绍

smart-doc从8月份底开始开源发布到目前为止已经迭代了几个版本。在这里非常感谢那些敢于用smart-doc去做尝试并积极提出建议的社区用户。因此决定在本博客中重要说明下smart-doc的功能,包括使...

上官胡闹
昨天
50
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部