Java设计模式(11)——结构型模式之享元模式(Flyweight)
一、概述
概念
避免大量拥有相同内容的小类的开销(如耗费内存),使大家共享一个类(元类)。
UML简图
单纯享元模式
角色
抽象享元角色(Flyweight):定义享元子类公共接口
具体享元角色(ConcreteFlyweight):具体享元类,实现实例共享
享元工厂(FlyweightFacotry):创建和管理享元角色
客户端:维护一个对所有享元对象的引用,自行存储外部状态。
- 内部状态是存储在享元对象内部,一般在构造时确定或通过setter设置,并且不会随环境改变而改变的状态,因此内部状态可以共享。
- 外部状态是随环境改变而改变、不可以共享的状态。外部状态在需要使用时通过客户端传入享元对象。外部状态必须由客户端保存。
对于以上两种状态不是很明白可以等下文的代码中具体体会!
更加具体的内外状态的示例:在咖啡店里,咖啡有“口味”之分,也就是口味可以作为咖啡的内部状态,而咖啡做好后送到对应桌号的桌子上,由于桌子是不固定的,故桌子作为外部状态。 --参考自《Java与模式》的例子
复合享元模式
应用场景
二、实践
就按照单纯享元模式进行代码的创建
抽象享元接口
/**
* 抽象享元角色
*
* @author Administrator
**/
public abstract class Flyweight {
/**
*接口方法
* @param externalState 外部状态,由客户端传入
*/
public abstract void method1(String externalState);
}
具体享元类
/**
* 具体享元角色
*
* @author Administrator
**/
public class ConcreteFlyweight extends Flyweight{
/**
* 内部状态,构建时确定
*/
private String internalState; public ConcreteFlyweight(String internalState) {
this.internalState = internalState;
} @Override
public void method1(String externalState) {
System.out.println("内部状态:"+internalState);
System.out.println("外部状态:"+externalState);
}
}
享元工厂
/**
* 享元工厂
*
* @author Administrator
**/
public class FlyweightFactory {
private static Map<String, Flyweight> flyweightMap = new HashMap<>();
public static Flyweight getFlyweight(String state) {
if (flyweightMap.get(state) == null) { // flyweightMap.containsKey(state)
Flyweight flyweight = new ConcreteFlyweight(state);
flyweightMap.put(state, flyweight);
}
return flyweightMap.get(state);
}
}
三、思考与改进
什么条件下使用享元模式
Java设计模式(11)——结构型模式之享元模式(Flyweight)的更多相关文章
- 设计模式GOF23(结构型模式:代理模式,适配模式,桥接模式,组合模式,装饰模式,外观模式,享元模式)
结构型模式: – 分类: • 适配器模式.代理模式.桥接模式.装饰模式.组合模式.外观模式.享元模式 – 核心作用:是从程序的结构上实现松耦合,从而可以扩大整体的类结构,用来解决更大的问题. 结构 ...
- Java设计模式之结构型模式
结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 一.适配器模式: 意图: 将一个类的接口转换成客户希望的另外一个接口.Adapter 模式使得原本由于接 ...
- 七个结构模式之享元模式(Flyweight Pattern)
定义: 运用共享技术对大量细粒度对象的复用,这要求这些对象都很相似,状态变化很小.将这些对象的内部状态和外部状态进行区分,对于内部状态相同的只存储一个对象,而对不同的外部状态则采用不同的操作. 结构图 ...
- 设计模式21---设计模式之享元模式(Flyweight)(结构型)
1.讲解享元模式(结构型) 1.1享元模式定义 运用共享技术有效地支持大量细粒度对象. 享元:把内部状态共享出来 1.2享元模式要点 重点在于分离变与不变. 把一个对象的状态分为内部状态和外部状态,内 ...
- GoF23种设计模式之结构型模式之享元模式
一.概述 运用共享技术有效地支持大量细粒度的对象. 二.适用性 1.当一个应用程序使用了大量的对象的时候. 2.由于使用大量的独享而造成很大的存储开销的时候. 3.对象的大多数状态都可变为外部状态的 ...
- java设计模式5.组合模式、门面模式、享元模式、桥接模式
组合模式 在面向对象的语言中,树结构有着巨大的威力,一个基于继承的类型的等级结构便是一个数结构,一个基于合成的对象结构也是一个数结构.组合模式将部分与整体的关系用树结构表示出来,使得客户端把一个个单独 ...
- 结构型模式(六) 享元模式(Flyweight)
一.动机(Motivate) 在软件系统中,采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中,从而带来很高的运行时代价--主要指内存需求方面的代价.如何在避免大量细粒度对象问题的同时,让外 ...
- 设计模式C#实现(十三)——享元模式(蝇量模式)
意图 0 适用性 1 结构 2 实现 3 效果 4 参考 5 意图 运用共享技术有效地支持大量细粒度的对象. 适用性 当以下情况都成立时使用: 一个程序使用了大量的对象 完全由于使用大量对象造成很大存 ...
- 设计模式---对象性能模式之享元模式(Flyweight)
一:概念 通过与其他类似对象共享数据来减少内存占用 如果一个应用程序使用了太多的对象, 就会造成很大的存储开销. 特别是对于大量轻量级 (细粒度)的对象,比如在文档编辑器的设计过程中,我们如果为每个字 ...
随机推荐
- U-Mail邮件群发如何过滤无效地址?
U-Mail邮件群发平台可以自动过滤掉无效和重复地址,过滤效果如下图 U-Mail邮件群发平台会将客户已经确认好是无效地址的加入无效地址库,下次再导入改无效地址就直接拒绝.邮件格式不正确的也会直接过滤 ...
- 017random模块
import randomprint(random.random())print(random.randint(1,8)) #包括8 print(random. ...
- 使用Swagger处理Api的显示与隐藏
一.在SwaggerConfig.cs中配置如下: c.DocumentFilter<ShowApiFilter>(); c.DocumentFilter<HideApiFilter ...
- 从windows到linux的换行转换工具dos2unix
同学们也许知道,windows中的文本文件的换行符是"\r\n",而linux中是"\n".由于换行符的不同,所以有的时候会发生一些莫名其妙的状况.至于具体什么 ...
- C#利用NPOI处理excel的类 NPOIHelper.cs
个人的NPOIHelp类,包括datatable导出到excel,dataset导出到excel,excel导入到datatable,excel导入到dataset, 更新excel中的数据,验证导入 ...
- mac zsh 快捷定位文件
brew install zsh vim ~/.zshrc plugins=(git autojump zsh-autosuggestions zsh-syntax-highlighting yarn ...
- Educational Codeforces Round 55 (Rated for Div. 2) B. Vova and Trophies 【贪心 】
传送门:http://codeforces.com/contest/1082/problem/B B. Vova and Trophies time limit per test 2 seconds ...
- HDU 1286 找新朋友 (欧拉公式或者标记法(其实就是欧拉公式的思想))
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1286 找新朋友 Time Limit: 2000/1000 MS (Java/Others) M ...
- hadoop-2.2.0 HA配置
采用的是4台真实机器: namenode:qzhong node27 datanode:qzhong node27 node100 node101 操作系统环境:qzhong(Ubuntu-14.0 ...
- 转:system.Security.Cryptography C# 加密和解密
以下文转自: http://www.360doc.com/content/13/0122/05/19147_261678471.shtml 总结:注册的时候经过MD5加密存进数据库,在登录的时候需要先 ...