享元模式(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. 浅谈C/C++堆栈指引——C/C++堆栈很强大(绝美)

    C/C++堆栈指引 Binhua Liu 前言 我们经常会讨论这样的问题:什么时候数据存储在飞鸽传书堆栈(Stack)中,什么时候数据存储在堆(Heap)中.我们知道,局部变量是存储在堆栈中的:deb ...

  2. cross-compile-openssl-windows.sh,cross-compile-curl-windows.sh,cross-compile-zlib-windows.sh,build-zlib-visual-studio-2015-cli.bat

    https://gist.github.com/artynet build zlib with Visual Studio CLI toolhttps://gist.github.com/artyne ...

  3. Golang的演化历程

    本文来自Google的Golang语言设计者之一Rob Pike大神在GopherCon2014大会上的开幕主题演讲资料“Hello, Gophers!”.Rob大神在这次分 享中用了两个生动的例子讲 ...

  4. [WPF疑难] 模式窗口被隐藏后重新显示时变成了非模式窗口

    原文:[WPF疑难] 模式窗口被隐藏后重新显示时变成了非模式窗口 [WPF疑难] 模式窗口被隐藏后重新显示时变成了非模式窗口 周银辉 现象: 大家可以试试下面这个很有趣但会带来Defect的现象:当我 ...

  5. Windows 10开发基础——文件、文件夹和库(二)

    主要内容: 使用选取器打开和保存文件 关于文件.文件夹和库,如果深究其实还是有比较多的内容,我们这一次来学习一下选取器就收了.还有上篇博文中读写文本文件的三种方式可以细细体会一下. 文件选取器包含文件 ...

  6. 在IE浏览器 使用PHPExcel导出文件时时 文件名中文乱码

    1.当我们使用IE内核的浏览器下在PHPExcel报表时(谷歌.火狐浏览器正常, IE浏览器,360浏览器的兼容模式报错),会出现如下错误: 2.解决办法: 在下载文件时,对当前的浏览器进行判断, 如 ...

  7. 活锁(livelock) 专题

    活锁(livelock) 活锁指的是任务或者执行者没有被阻塞,由于某些条件没有满足,导致一直重复尝试,失败,尝试,失败. 活锁和死锁的区别在于,处于活锁的实体是在不断的改变状态,所谓的“活”, 而处于 ...

  8. ArcGIS数据生产与精细化制图之中国年降水量分布图的制作

    原文:ArcGIS数据生产与精细化制图之中国年降水量分布图的制作 楼主按:在今年的Esri中国用户大会上,我听了几场关于ArcGIS用于制图方面的讲座,也在体验区与Esri中国的技术老师有一些交流.一 ...

  9. 在Delphi中静态调用DLL

    在Delphi中静态调用DLL top 调用一个DLL比写一个DLL要容易一些.首先给大家介绍的是静态调用方法,稍后将介绍动态调用方法,并就两种方法做一个比较.同样的,我们先举一个静态调用的例子. u ...

  10. 零元学Expression Blend 4 - Chapter 1 缘起

    原文:零元学Expression Blend 4 - Chapter 1 缘起 本来都使用Adobe相关工具从事设计工作的我,因缘际会下,接触到了Expression Blend 4,让我完全的对微软 ...