享元模式(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. Ajax打开三种页面的请求

    xmlhttprequest对象可以打开两种方式的页面请求 1,.asmx格式的webservice页面. 2,.aspx格式的web窗体 其中web窗体可以是调用一新建的web窗体,同时调用和被调用 ...

  2. crossplatform----文本编辑器工具Atom安装

    1.简介 Atom 是 Github 专门为程序员推出的一个跨平台文本编辑器.具有简洁和直观的图形用户界面,并有很多有趣的特点:支持CSS,HTML,JavaScript等网页编程语言.它支持宏,自动 ...

  3. react项目实践——(2)webpack-dev-serve

    webpack-dev-server是一个小型的静态文件服务器,为webpack打包的资源文件提供Web服务.并且提供自动刷新和Hot Module Replacement(模块热替换:前端代码变动后 ...

  4. Hibernate入门配置案例

    Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自 ...

  5. JS 小鸟飞

    <!DOCTYPE html><html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...

  6. WPF MVVM+EF 增删改查 简单示例(一)

    实现了那些功能,先看看效果图: 项目工程目录: 接下来开始具体的步骤: 第一步:在VS中新建工程 第二步:使用NuGet 安装EntityFramework 第三步:使用NuGet 安装EntityF ...

  7. Httpclient Fluent API简单封装

    import java.io.IOException;import java.util.ArrayList;import java.util.HashMap;import java.util.List ...

  8. php 如何利用 soap调用.Net的WebService asmx文件

    原文:php 如何利用 soap调用.Net的WebService asmx文件 最近,帮一个同行测试用.net写的WebService接口,C#调用通过,现在需要测试一下php版本对它的调用,经过各 ...

  9. Asp +Js 无刷新分页

    Default.aspx代码 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind=" ...

  10. 【转】在C#中简单的科学计算,包括幂数,指数,对数,Math类

    用Math类进行一些简单的科学计算,包括幂数,指数,对数等的计算: double m,n; m=Math.Exp(0.5); //自然对数e的0.5次方 n=Math.Exp(); //自然对数e的3 ...