【设计模式】结构型06享元模式(Flyweight Pattern)
享元模式(Flyweight Pattern)
首先吐槽下这个名字,享元?共享元素的话感觉还是蛮好的~但是这个英文。。。
意图:更好的重用、管理对象,减少内存开销,节约资源。
主要解决:在有大量重复对象时,通过抽象,对对象统一管理。
何时使用:1、系统中有大量对象。2、这些对象消耗大量内存。3、这些对象的状态大部分可以外部化。4、这些对象可以按照内蕴状态分为很多组,当把外蕴对象从对象中剔除出来时,每一组对象都可以用一个对象来代替。5、系统不依赖于这些对象身份,这些对象是不可分辨的。
如何解决:用唯一标识码判断,如果在内存中有,则返回这个唯一标识码所标识的对象。
这里和我自己理解的有些许差别,直接导致了两种想法。第一种,重点在于标记对象。第二种重点在于重用对象(创建型模式中的原型模式区别不大)。
下面是按照自己理解写的demo:
类图:复习并二次整理的时候画。
代码:
1、创建链接接口以及实现类(对对象进行抽象):
package com.pat.flyweight;
/**
* 链接接口,代表一类链接
* @author ZX
*/
public interface Connector {
void connect();
}
实现类如下:
package com.pat.flyweight;
/**
* 链接实现类-mysql链接
* @author ZX
*
*/
public class MySqlConnector implements Connector{
@Override
public void connect() {
System.out.println("链接到MySql数据库"+this.toString());
}
}
package com.pat.flyweight;
/**
* 链接子类,Oracle链接
* @author ZX
*
*/
public class OracleConnector implements Connector{
@Override
public void connect() {
System.out.println("链接到Oracle数据库"+this.getClass());
}
}
2、工厂类:
package com.pat.flyweight;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 链接工厂-生产链接
* @author ZX
*/
public class ConnectorFactory {
//为方便演示结果,采用简单的数据结构
private Map<String, Connector> pool = new HashMap<>();
/**
* 获得一个Mysql链接
* @return
*/
public Connector getMySqlConnector() {
Connector mySql = pool.get("mysql");
if(pool.get("mysql")==null) {
mySql = new MySqlConnector();
pool.put("mysql", mySql);
}
return mySql;
}
public Connector getOracleConnector() {
Connector mySql = pool.get("oracle");
if(pool.get("oracle")==null) {
mySql = new MySqlConnector();
pool.put("oracle", mySql);
}
return mySql;
}
}
3、测试类:
package com.pat.flyweight;
public class Test {
public static void main(String[] args) {
//创建链接工厂
ConnectorFactory sf =new ConnectorFactory();
//获取Mysql链接
Connector mySqlConnector = sf.getMySqlConnector();
Connector mySqlConnector2 = sf.getMySqlConnector();
Connector mySqlConnector3 = sf.getMySqlConnector();
mySqlConnector.connect();
mySqlConnector2.connect();
mySqlConnector3.connect();
//获取oracle链接
Connector oracleConnector = sf.getOracleConnector();
Connector oracleConnector2 = sf.getOracleConnector();
Connector oracleConnector3 = sf.getOracleConnector();
oracleConnector.connect();
oracleConnector2.connect();
oracleConnector3.connect();
}
}
4、结果:
链接到MySql数据库com.pat.flyweight.MySqlConnector@7852e922
链接到MySql数据库com.pat.flyweight.MySqlConnector@7852e922
链接到MySql数据库com.pat.flyweight.MySqlConnector@7852e922
链接到MySql数据库com.pat.flyweight.MySqlConnector@4e25154f
链接到MySql数据库com.pat.flyweight.MySqlConnector@4e25154f
链接到MySql数据库com.pat.flyweight.MySqlConnector@4e25154f
可以看到,这里一直重用了容器中的对象,实现了对象的重用。
【设计模式】结构型06享元模式(Flyweight Pattern)的更多相关文章
- 设计模式(十)享元模式Flyweight(结构型)
设计模式(十)享元模式Flyweight(结构型) 说明: 相对于其它模式,Flyweight模式在PHP实现似乎没有太大的意义,因为PHP的生命周期就在一个请求,请求执行完了,php占用的资源都被释 ...
- 设计模式-11享元模式(Flyweight Pattern)
1.模式动机 在面向对象程序设计过程中,有时会面临要创建大量相同或相似对象实例的问题.创建那么多的对象将会耗费很多的系统资源,它是系统性能提高的一个瓶颈. 享元模式就是把相同或相似对象的公共部分提取出 ...
- 设计模式系列之享元模式(Flyweight Pattern)——实现对象的复用
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
- 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern)
原文:乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) 作者:weba ...
- 二十四种设计模式:享元模式(Flyweight Pattern)
享元模式(Flyweight Pattern) 介绍运用共享技术有效地支持大量细粒度的对象. 示例有一个Message实体类,某些对象对它的操作有Insert()和Get()方法,现在要运用共享技术支 ...
- Java享元模式(Flyweight Pattern)
享元模式(Flyweight Pattern)主要用于减少创建的对象数量,并减少内存占用并提高性能. 这种类型的设计模式属于结构模式,因为该模式提供了减少对象计数的方法,从而改善应用的对象结构. 享元 ...
- 【UE4 设计模式】享元模式 Flyweight Pattern
概述 描述 运用共享技术有效地支持大量细粒度对象的复用.系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用. 由于享元模式要求能够共享的对象必须是细粒度对象,因此它又称为轻 ...
- 享元模式<Flyweight Pattern>
1.What-是什么? 享元模式是一种轻量级的结构型模式.旨在以共享的方式高效的支持大量的细粒度对象的复用.要求能够共享的对象必须是细粒度对象,这些对象比较相似,状态变化小. 2.Why-为什么? ...
- 七个结构模式之享元模式(Flyweight Pattern)
定义: 运用共享技术对大量细粒度对象的复用,这要求这些对象都很相似,状态变化很小.将这些对象的内部状态和外部状态进行区分,对于内部状态相同的只存储一个对象,而对不同的外部状态则采用不同的操作. 结构图 ...
随机推荐
- Virtualization of iSCSI storage
This invention describes methods, apparatus and systems for virtualization of iSCSI storage. Virtual ...
- Oracle 学习笔记 18 -- 存储函数和存储过程(PL/SQL子程序)
PL/SQL子程序 它包含了函数和过程.此功能是指用户定义的函数.和系统功能是不同的.子程序通常完成特定的功能PL/SQL座.,能够被不同的应用程序多次调用.Oracle提供能够把PL/SQL程序存储 ...
- Cocos2d-x3.1下实现相似iOS页面滑动指示圆点
原文地址:http://blog.csdn.net/qqmcy/article/details/37612457 代码下载:http://download.csdn.net/detail/qqmcy/ ...
- 【HLSL学习笔记】WPF Shader Effect Library算法解读之[Embossed]
原文:[HLSL学习笔记]WPF Shader Effect Library算法解读之[Embossed] Embossed(浮雕效果) 浮雕效果主要有两个参数:Amount和Wid ...
- Analysis of variance(ANOVA)
方差分析,也称为"变异数分析",用于两个及两个以上样本均值(group means)差别的显著性检验.在 ANOVA 的环境下,一个观测得到的方差视为是由不同方差的源组合而成.
- 傻瓜突破linux--rootpassword
破password该方法: 方法1.单用户模式改动 (表示进入到单用户模式) ,按回车键,按b键启动.进入单用户模式.进行password改动,重新启动 init 5 口诀:e2e 空格1 回车b 开 ...
- nyoj 92 图片实用面积【bfs】
图像实用区域 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描写叙述 "ACKing"同学曾经做一个图像处理的项目时.遇到了一个问题,他须要摘取出图片中某 ...
- Java 阅读TXT文件
public class GenCategoryAttrItemHandler { private final static String INPUT_FILE_PATH = "input/ ...
- HDU 2845 Beans(dp)
Problem Description Bean-eating is an interesting game, everyone owns an M*N matrix, which is filled ...
- C# 写CSV文件字符串前面0不显示的解决办法
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Tex ...