享元模式(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)的更多相关文章

  1. 设计模式(十)享元模式Flyweight(结构型)

    设计模式(十)享元模式Flyweight(结构型) 说明: 相对于其它模式,Flyweight模式在PHP实现似乎没有太大的意义,因为PHP的生命周期就在一个请求,请求执行完了,php占用的资源都被释 ...

  2. 设计模式-11享元模式(Flyweight Pattern)

    1.模式动机 在面向对象程序设计过程中,有时会面临要创建大量相同或相似对象实例的问题.创建那么多的对象将会耗费很多的系统资源,它是系统性能提高的一个瓶颈. 享元模式就是把相同或相似对象的公共部分提取出 ...

  3. 设计模式系列之享元模式(Flyweight Pattern)——实现对象的复用

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  4. 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern)

    原文:乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) 作者:weba ...

  5. 二十四种设计模式:享元模式(Flyweight Pattern)

    享元模式(Flyweight Pattern) 介绍运用共享技术有效地支持大量细粒度的对象. 示例有一个Message实体类,某些对象对它的操作有Insert()和Get()方法,现在要运用共享技术支 ...

  6. Java享元模式(Flyweight Pattern)

    享元模式(Flyweight Pattern)主要用于减少创建的对象数量,并减少内存占用并提高性能. 这种类型的设计模式属于结构模式,因为该模式提供了减少对象计数的方法,从而改善应用的对象结构. 享元 ...

  7. 【UE4 设计模式】享元模式 Flyweight Pattern

    概述 描述 运用共享技术有效地支持大量细粒度对象的复用.系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用. 由于享元模式要求能够共享的对象必须是细粒度对象,因此它又称为轻 ...

  8. 享元模式<Flyweight Pattern>

    1.What-是什么?   享元模式是一种轻量级的结构型模式.旨在以共享的方式高效的支持大量的细粒度对象的复用.要求能够共享的对象必须是细粒度对象,这些对象比较相似,状态变化小. 2.Why-为什么? ...

  9. 七个结构模式之享元模式(Flyweight Pattern)

    定义: 运用共享技术对大量细粒度对象的复用,这要求这些对象都很相似,状态变化很小.将这些对象的内部状态和外部状态进行区分,对于内部状态相同的只存储一个对象,而对不同的外部状态则采用不同的操作. 结构图 ...

随机推荐

  1. Virtualization of iSCSI storage

    This invention describes methods, apparatus and systems for virtualization of iSCSI storage. Virtual ...

  2. Oracle 学习笔记 18 -- 存储函数和存储过程(PL/SQL子程序)

    PL/SQL子程序 它包含了函数和过程.此功能是指用户定义的函数.和系统功能是不同的.子程序通常完成特定的功能PL/SQL座.,能够被不同的应用程序多次调用.Oracle提供能够把PL/SQL程序存储 ...

  3. Cocos2d-x3.1下实现相似iOS页面滑动指示圆点

    原文地址:http://blog.csdn.net/qqmcy/article/details/37612457 代码下载:http://download.csdn.net/detail/qqmcy/ ...

  4. 【HLSL学习笔记】WPF Shader Effect Library算法解读之[Embossed]

    原文:[HLSL学习笔记]WPF Shader Effect Library算法解读之[Embossed] Embossed(浮雕效果)          浮雕效果主要有两个参数:Amount和Wid ...

  5. Analysis of variance(ANOVA)

    方差分析,也称为"变异数分析",用于两个及两个以上样本均值(group means)差别的显著性检验.在 ANOVA 的环境下,一个观测得到的方差视为是由不同方差的源组合而成.

  6. 傻瓜突破linux--rootpassword

    破password该方法: 方法1.单用户模式改动 (表示进入到单用户模式) ,按回车键,按b键启动.进入单用户模式.进行password改动,重新启动 init 5 口诀:e2e 空格1 回车b 开 ...

  7. nyoj 92 图片实用面积【bfs】

    图像实用区域 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描写叙述 "ACKing"同学曾经做一个图像处理的项目时.遇到了一个问题,他须要摘取出图片中某 ...

  8. Java 阅读TXT文件

    public class GenCategoryAttrItemHandler { private final static String INPUT_FILE_PATH = "input/ ...

  9. HDU 2845 Beans(dp)

    Problem Description Bean-eating is an interesting game, everyone owns an M*N matrix, which is filled ...

  10. C# 写CSV文件字符串前面0不显示的解决办法

    using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Tex ...