JAVA 设计模式 享元模式

用途

享元模式 (Flyweight)

运用共享技术有效地支持大量细粒度的对象。

享元模式是一种结构型模式

结构

图-享元模式结构图

Flyweight : 它是所有具体享元类的超类或接口,通过这个接口,Flyweight 可以接受并作用于外部状态。

abstract class Flyweight {
 public abstract void Operation(int extrinsicstates);
 }

ConcreteFlyweight :  是继承 Flyweight 超类或实现 Flyweight 接口,并为内部状态增加存储空间。

class ConcreteFlyweight extends Flyweight {
     @Override
 public void Operation(int extrinsicstates) {
         System.out.println("共享的Flyweight : " + extrinsicstates);
     }
 }

UnsharedConcreteFlyweight : 指那些不需要共享的 Flyweight 子类,因为 Flyweight 接口共享成为可能,但它并不强制共享。

class UnsharedConcreteFlyweight extends Flyweight {
     @Override
 public void Operation(int extrinsicstates) {
         System.out.println("不共享的Flyweight : " + extrinsicstates);
     }
 }

FlywightFactory :是一个享元工厂,用来创建并管理 Flyweight 对象。它主要是用来确保合理地共享 Flyweight ,当用户请求一个 Flyweight 时, FlyweightFactory 对象提供一个已创建的实例或创建一个(如果对象不存在的话)。

class FlywightFactory {
 private Hashtable<String, Flyweight> flyweights = new Hashtable<String, Flyweight>();
 
 public FlywightFactory() {
         flyweights.put("X", new ConcreteFlyweight());
         flyweights.put("Y", new ConcreteFlyweight());
         flyweights.put("Z", new ConcreteFlyweight());
     }
 
 public Flyweight GetFlyweight(String key) {
 return ((Flyweight)flyweights.get(key));
     }
 }

测试代码

public class FlyweightPattern {
 public static void main(String[] args) {
 int extrinsicstates = 1;    
         FlywightFactory factory = new FlywightFactory();
 
         Flyweight fx = factory.GetFlyweight("X");
         fx.Operation(extrinsicstates);
 
         Flyweight fy = factory.GetFlyweight("Y");
         fy.Operation(++extrinsicstates);
 
         Flyweight fz = factory.GetFlyweight("Z");
         fz.Operation(++extrinsicstates);
 
         Flyweight uf = new UnsharedConcreteFlyweight();
         uf.Operation(++extrinsicstates);
     }
 }

运行结果

 共享的Flyweight : 1
 共享的Flyweight : 2
 共享的Flyweight : 3
 不共享的Flyweight : 4

推荐

本文属于 JAVA设计模式系列

参考资料

《大话设计模式》《HeadFirst设计模式》

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏linux驱动个人学习

input子系统事件处理层(evdev)的环形缓冲区【转】

在事件处理层(evdev.c)中结构体evdev_client定义了一个环形缓冲区(circular buffer),其原理是用数组的方式实现了一个先进先出的循...

2676
来自专栏JavaQ

Java研发方向如何准备BAT技术面试答案(上)

最近因为忙于工作,没时间整理,本篇是下班后晚上抽空整理的,文中部分答案本来是想自己好好整理一份的,但是时间真的很紧,所以就整理了一下网络上的文章链接,挑了写的不...

3325
来自专栏阿杜的世界

Java Web技术经验总结(十)

在遇到“java.lang.OutOfMemoryError”错误时,首先需要根据MAT工具确认是内存泄漏还是内存溢出。

832
来自专栏程序猿

父子节点

create table Jiedian( node hierarchyid primary key, nodLevel as node.Get...

34910
来自专栏Java技术栈

Java 面试题经典 77 问(含答案)!

1433
来自专栏Spark生态圈

[spark] 内存管理 MemoryManager 解析

spark的内存管理有两套方案,新旧方案分别对应的类是UnifiedMemoryManager和StaticMemoryManager。

1102
来自专栏个人分享

MapReduce格式与类型

  MapReduce是一个简单的数据处理模型,map与reduce的输入和输出类型都为key-value形式的键值对。

711
来自专栏java 成神之路

深入分析JVM逃逸分析对性能的影响

33410
来自专栏everhad

Android内存泄漏分享

内容概述 内存泄漏和内存管理相关基础。 Android中的内存使用。 内存分析工具和实践。 以下内容不考虑非引用类型的数据,或者将其等同为对应的引用类型看待——...

1976
来自专栏分布式系统进阶

Kafka中的时间轮Kafka源码分析-汇总

将TimerTask对象绑定到 TimerTaskEntry上 如果这个TimerTask对象之前已经绑定到了一个 TimerTaskEntry上, 先调用t...

561

扫码关注云+社区