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

相关文章

来自专栏Java学习网

Android中Java和JavaScript交互

Android中Java和JavaScript交互 Android提供了一个很强大的WebView控件用来处理Web网页,而在网页中,JavaScript又是...

2836
来自专栏HansBug's Lab

关于一般的并查集求根操作的一组对照研究

说道并查集,大家一定对于以多叉树状结构为基础的并查集并不陌生,最常见的两种写法如下 1 function getfat(x:longint):longint; ...

3519
来自专栏大内老A

为ASP.NET MVC创建一个基于Unity的ControllerFactory

谈到IoC和ASP.NET的集成,很多人会先后想到Ninject,不过我们个人还是倾向于Unity。这篇文章简单地介绍如果创建基于Unity的Controlle...

1787
来自专栏dotnet core相关

WCF入门(8)

下午去办市民卡,被告知说“本人医保现在停保,要等继续缴才行”,白公交坐了那么远的路。

994
来自专栏hbbliyong

Extjs4.2+webAPI+EF实现分页以及webapi的数据传值

由于不明白分页的总数是怎么计算,不知道他的分页方式所以花费了好多功夫,现在弄出来了与大家分享下 1.首先是EF的简历,想必大家都清楚:添加-〉新建项-〉数据-〉...

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

Librdkafka的操作处理队列

1692
来自专栏瓜大三哥

Yaffs_guts(三)

1.垃圾回收 1.static int yaffs_InitialiseBlocks(yaffs_Device *dev,int nBlocks)//块初始化 ...

2085
来自专栏chenssy

【死磕Sharding-jdbc】---强制路由

位于 sharding-jdbc-core模块下的包 com.dangdang.ddframe.rdb.sharding.hint中,核心类HintManage...

1171
来自专栏码匠的流水账

聊聊kafka client chunkQueue 与 MaxLag值

前面一篇文章讨论了ConsumerFetcherManager的MaxLag与ConsumerOffsetChecker的lag值的区别。但是关于MaxLag的...

601
来自专栏编码小白

tomcat请求处理分析(六)servlet的处理过程

1.1.1.1  servlet的解析过程 servlet的解析分为两步实现,第一个是匹配到对应的Wrapper,第二个是加载对应的servlet并进行数据,这...

6127

扫码关注云+社区