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)
一:概念 通过与其他类似对象共享数据来减少内存占用 如果一个应用程序使用了太多的对象, 就会造成很大的存储开销. 特别是对于大量轻量级 (细粒度)的对象,比如在文档编辑器的设计过程中,我们如果为每个字 ...
随机推荐
- SAP技术专家的ABAP调试器培训材料
首先弄清楚ABAP Classic调试器和新调试器的区别: Classic debugger: (1) Static breakpoint a. BREAK-POINT : non-user spec ...
- OC Copy and MutableCopy的使用
#import <Foundation/Foundation.h> @interface Student : NSObject <NSCopying> // copy代表set ...
- 用画小狗的方法来解释Java中的值传递
在开始看我画小狗之前,咱们先来看道很简单的题目: 下面程序的输出是什么? Dog myDog = new Dog("旺财"); changeName(myDog); System. ...
- codeforces 814D An overnight dance in discotheque
题目链接 正解:贪心. 首先我们可以计算出每个圆被多少个圆覆盖. 很显然,最外面的圆是肯定要加上的. 然后第二层的圆也是要加上的.那么第三层就不可能被加上了.同理,第四层的圆又一定会被加上. 然后我们 ...
- Yii中POS和GET并用范例
页面 <?php $form=$this->beginWidget('CActiveForm', array( 'id'=>'add-form', 'enableAjaxValida ...
- R在Centos下安装
R语言是主要用于统计分析.绘图的语言和操作环境. 官方网站: http://www.r-project.org/ Windows下面有直接的安装包,直接下载安装很方便,但是对于刚出的CentOS6.0 ...
- UVa 11400 - Lighting System Design(线性DP)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- BZOJ4530:[BJOI2014]大融合(LCT)
Description 小强要在N个孤立的星球上建立起一套通信系统.这套通信系统就是连接N个点的一个树. 这个树的边是一条一条添加上去的.在某个时刻,一条边的负载就是它所在的当前能够 联通的树上路过它 ...
- js 获取后台数据分页
页面创建一个存放内容的容器,以及分页的容器: <div id="content"></div> <div id="pager"&g ...
- Kernel Ridge Regression
回顾一下岭回归,岭回归的目的是学习得到特征和因变量之间的映射关系,由于特征可能很高维,所以需要正则化 岭回归的目标函数是 $$ \sum_{i=1}^n \left\|y-X\beta\right\| ...