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)
一:概念 通过与其他类似对象共享数据来减少内存占用 如果一个应用程序使用了太多的对象, 就会造成很大的存储开销. 特别是对于大量轻量级 (细粒度)的对象,比如在文档编辑器的设计过程中,我们如果为每个字 ...
随机推荐
- selenium+python 数据驱动-txt篇
#循环读取txt文件中的数据,可以作为用户名,密码等使用from selenium import webdriver #创建两个列表user=[]pwd=[]f=open(r'C:\bbs\data\ ...
- xtrabackup在线迁移mysql并搭建为主主同步
一.背景 工作中有需求数据库需要迁移,但是不能停服,不能锁库锁表影响业务的正常运行,所以使用XtraBackup 二.环境: 操作系统:CentOS Linux release 7.4.1708 (C ...
- She must be at least thirty-five years old.
She must be at least thirty-five years old. Though life's goodness can at times be overshadowed,it i ...
- python UI自动化实战记录十一: 总结
首先说说为什么想起来用自动化脚本来实现该项目的自动化. 工作还是以手工测试为主,业务驱动型的项目大概就是这样,业务不停地变,不断的迭代. 自动化测试实施的先决条件: 一 得有时间. 如果有时间大部分的 ...
- c++ auto_ptr超简易版实现
namespace wang{ template<class T> class shared_ptr{ public: explicit shared_ptr(T *p) : count( ...
- django+ajax用FileResponse文件下载到浏览器过程中遇到的问题
问题: 公司的需求是从mongodb中查找数据并下载回本地,但是在将文件从mongodb通过django服务端,然后从django服务端向浏览器下载文件.但是在下载的时候出了些问题.由于是用的ajax ...
- 树形背包O(n * v^2)入门
我虽然做了好几道树形背包的题,但是一直不是十分理解,对于每一道题,总是看题解就明白,然后换一道题自己写不出来.临近NOIP,gg让我们强化一下背包以及树形背包,我也恰有此打算,于是又开始从头学习了树形 ...
- Html5的本地储存 Web Storage
Html5 中的存储包括两种:sessionStorage 和 localStorage sessionStorage 用于本地存储一个会话(session)中的数据,这些数据只有在同一个会话 ...
- 【转】计算Java List中的重复项出现次数
本文演示如何使用Collections.frequency和Map来计算重复项出现的次数.(Collections.frequency在JDK 1.5版本以后支持) package com.qiyad ...
- Unity中自定义扩展方法
问题背景 在使用unity开发过程中,通常会遇到一种情况,比如说给物体重新赋值坐标的问题, Transfrom tran: ,pos_y=,pos_z=; tran.position=new Vect ...