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 条评论
登录 后参与评论

相关文章

来自专栏雨尘分享

ReactiveCocoa 入门知识——归总篇

1644
来自专栏木宛城主

步步为营:三层架构+ASP.NET MVC 架构的快速搭建(入门篇)

上一篇博客中《两天完成一个小型工程报价系统》,许多朋友向我讨源码。其实我之后没发了,确实那种三层架构没什么意思,只是我个人的孤芳自赏,很多的处理都不是很成熟。...

4606
来自专栏史上最简单的Spring Cloud教程

深入理解Feign之源码解析

什么是Feign Feign是受到Retrofit,JAXRS-2.0和WebSocket的影响,它是一个jav的到http客户端绑定的开源项目。 Feign的...

7347
来自专栏应用案例

iOS开发进阶篇——FRP与ReactiveCocoa的介绍(一)

*****阅读完此文,大约需要30分钟***** 本篇章主要以介绍FRP以及RAC的信号相关概念为主。 一、FRP的概念 RAC(ReactiveCocoa)是...

1739
来自专栏美团技术团队

ReactiveCocoa中潜在的内存泄漏及解决方案

ReactiveCocoa是GitHub开源的一个函数响应式编程框架,目前在美团App中大量使用。用过它的人都知道很好用,也确实为我们的生活带来了很多便利,特别...

4458
来自专栏伟哥专栏

C#封装v5 COS API实践-put方法

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

Kafka源码分析-网络层-2

这里面最主要的就是accept(key, processors(currentProcessor)) (4) accept: 设置新连接socket的参数后交...

741
来自专栏美团技术团队

细说ReactiveCocoa的冷信号与热信号系列(3)

ReactiveCocoa(简称RAC)是最初由GitHub团队开发的一套基于Cocoa的FRP框架。冷信号与热信号的概念很容易混淆并造成一定的问题。鉴于这个问...

3525
来自专栏企鹅号快讯

iOS开发进阶篇——FRP与ReactiveCocoa的介绍(一)

*****阅读完此文,大约需要30分钟***** 一、FRP的概念 RAC(ReactiveCocoa)是由GitHub团队开发的基于Cocoa的FRP框架。提...

1718
来自专栏Netkiller

Spring boot with Schedule (启用/禁用)

本文节选自《Netkiller Java 手札》 5.19.4. 计划任务控制 matchIfMissing = true, 如果改属性条目不存在返回 true...

3937

扫码关注云+社区