设计模式学习笔记——享元(Flyweight)模式

@(设计模式)[设计模式, 享元模式, flyweight]

  • 设计模式学习笔记享元Flyweight模式

    • 基本介绍
    • 享元案例
      • 类图
      • 实现代码
        • BigChar类
        • BigCharFactory类
        • BigString类
        • 测试类
        • 运行结果
    • 享元模式中的角色
      • Flyweight轻量级
      • FlyweightFactory轻量级工厂
      • Client请求者
      • 类图

基本介绍

享元模式适用于需要new大量对象的情况。通过共享实例的方式避免new出实例,浪费资源。
在使用享元模式的时候要注意,当共享实例修改时,将会影响使用该实例的多处地方,所以使用前需要斟酌,什么类需要使用享元模式。

享元案例

类图

实现代码

BigChar类

package com.pc.flyweight.example;import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;/*** 大字符类* Created by Switch on 2017/3/31.*/
public class BigChar {/*** 字符名称*/private char charname;/*** 大型字符对应的字符串(由'#' '.' '\n'组成)*/private String fontdata;/*** 构造方法,设置字符名称,并初始化数据** @param charname 字符名称*/public BigChar(char charname) {this.charname = charname;try {BufferedReader reader = new BufferedReader(new FileReader(System.getProperty("user.dir")+ "/src/main/java/com/pc/flyweight/example/char/big" + charname + ".txt"));String line;StringBuffer buf = new StringBuffer();while ((line = reader.readLine()) != null) {buf.append(line);buf.append("\n");}reader.close();this.fontdata = buf.toString();} catch (IOException e) {this.fontdata = charname + "?\n";}}/*** 显示大型字符*/public void print() {System.out.print(fontdata);}
}

BigCharFactory类

package com.pc.flyweight.example;import java.util.HashMap;
import java.util.Map;/*** 大字符工厂类* Created by Switch on 2017/3/31.*/
public final class BigCharFactory {/*** 管理已经生成的BigChar的实例*/private Map<String, BigChar> pool = new HashMap<>();/*** 唯一实例*/private static BigCharFactory instance = new BigCharFactory();/*** 获取实例** @return 实例*/public static BigCharFactory getInstance() {return instance;}private BigCharFactory() {}/*** 生成(共享)BigChar类的实例** @param charname 字符名* @return 大字符对象*/public synchronized BigChar getBigChar(char charname) {BigChar bc = pool.get("" + charname);if (bc == null) {bc = new BigChar(charname);pool.put("" + charname, bc);}return bc;}
}

BigString类

package com.pc.flyweight.example;/*** 大字符串* Created by Switch on 2017/3/31.*/
public class BigString {/*** 大字符数组*/private BigChar[] bigChars;/*** 构造方法,传入字符串** @param string 字符串*/public BigString(String string) {bigChars = new BigChar[string.length()];BigCharFactory factory = BigCharFactory.getInstance();for (int i = 0; i < bigChars.length; i++) {bigChars[i] = factory.getBigChar(string.charAt(i));}}/*** 显示*/public void print() {for (int i = 0; i < bigChars.length; i++) {bigChars[i].print();}}
}

测试类

package com.pc.flyweight.example.test;import com.pc.flyweight.example.BigString;
import org.junit.Test;/*** BigString Tester.** @author Switch* @version 1.0*/
public class BigStringTest {/*** 测试享元模式*/@Testpublic void testBigString() {BigString bigString = new BigString("123-456.");bigString.print();}
}

运行结果

......##........
..######........
......##........
......##........
......##........
......##........
..##########....
................
....######......
..##......##....
..........##....
......####......
....##..........
..##............
..##########....
................
....######......
..##......##....
..........##....
......####......
..........##....
..##......##....
....######......
................
................
................
................
................
..##########....
................
................
................
........##......
......####......
....##..##......
..##....##......
..##########....
........##......
......######....
................
..##########....
..##............
..##............
..########......
..........##....
..##......##....
....######......
................
....######......
..##......##....
..##............
..########......
..##......##....
..##......##....
....######......
................
.?

享元模式中的角色

Flyweight(轻量级)

按照通常方式编写程序会导致程序变重,所以如果能够共享实例会比较好,而Flyweight角色表示的就是那些实例会被共享的类。在案例中,由BigChar类扮演此角色。

FlyweightFactory(轻量级工厂)

FlyweightFactory角色是生成Flyweight角色的工厂。在工厂中生成Flyweight角色可以实现共享实例。在案例中,由BigCharFactory类扮演此角色。

Client(请求者)

Client角色使用FlyweightFactory角色来生成Flyweight角色。在案例中,由BigString类扮演此角色。

类图

GitHub:DesignPatternStudy

——————参考《图解设计模式》

设计模式学习笔记——享元(Flyweight)模式相关推荐

  1. 设计模式学习笔记--享元(Flyweight)模式

    写在模式学习之前 什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方案,这就是软件模式:每一个模式描述了一个在我们程序设计中经常发生的问题,以及该问题的解决方案:当我们碰到模式 ...

  2. 设计模式学习笔记——中介者(Mediator)模式

    设计模式学习笔记--中介者(Mediator)模式 @(设计模式)[设计模式, 中介者模式, Mediator] 设计模式学习笔记中介者Mediator模式 基本介绍 中介者案例 类图 实现代码 Me ...

  3. 设计模式学习笔记——单例(Singleton)模式

    设计模式学习笔记--单例(Singleton)模式 @(设计模式)[设计模式, 单例模式, Singleton, 懒汉式, 饿汉式] 设计模式学习笔记单例Singleton模式 基本介绍 单例案例 类 ...

  4. Java 实现享元(Flyweight)模式

    /*** 字母* @author stone**/ public class Letter {private String name;public Letter(String name) {this. ...

  5. 设计模式学习笔记--Mediator 中介者模式

    我们知道面向对象应用程序是由一组为了提供某种服务而彼此交互的对象组成.当彼此引用的对象数量比较少时,此时对象之间就为直接交互(点对点).而当对象的数量增加时,这种直接交互会导致对象之间复杂的.混乱的引 ...

  6. python 享元模式_python 设计模式之享元(Flyweight)模式

    #写在前面 这个设计模式理解起来很容易.百度百科上说的有点绕口. #享元模式的定义 运用共享技术来有効地支持大量细粒度对象的复用. 它通过共享已经存在的对橡大幅度减少需要创建的对象数量.避免大量相似类 ...

  7. 设计模式--享元(Flyweight)模式

    模式定义 运用共享技术有效地支持大量细粒度的对象 类图 应用场景 如果系统有大量类似的对象,可以使用享元模式 优点 如果系统有大量类似的对象,可以节省大量的内存及CPU资源 要点总结 要点总结 如果系 ...

  8. java 地图模式_Java设计模式之从[Dota地图]分析享元(Flyweight)模式

    在Dota游戏的地图中有几百棵树,现在假设这些树木无非是这两种:白杨.枫树,数量一共为400棵,那么,在装载这个地图场景的时候,我们是不是应该给这400课树一一建立对象呢?(如:MapItem tre ...

  9. 设计模式(11)——享元(Flyweight)模式

    什么是享元模式? 享元模式跟CACHE机制类似,它运用共享技术有效地支持大量细粒度的对象.Flyweight通过尽可能地与其他对象共享数据来减少对内存的使用. Flyweight的经典例子就是字符处理 ...

最新文章

  1. 软件工程师安德烈·梅萨成功夺得世界小姐桂冠
  2. 计算机为什么会出现网络用户,告诉你电脑显示无internet访问权限怎么办
  3. python class和def的区别_Python中class和def的理解
  4. TurboMail邮件系统实用技巧十四:如何知道对方已经读信
  5. c语言中if条件语句说课内容,if语句-ppt-说课--试讲-C语言.ppt
  6. 9月20日 DNS总结
  7. 对于SQL注入的理解
  8. pythonm 用法-------list实现购物车
  9. Linux Watchdog Test Program
  10. office commmunication server 2007企业版关于通讯簿共享权限问题(无法同步)
  11. 【Adobe Air程序开发】用Adobe Flex3开发AIR应用程序–入门指南
  12. 端口扫描工具有哪些linux,Linux C语言写的超级简单端口扫描器linux操作系统 -电脑资料...
  13. Excel如何判断数据是否重复
  14. 百度网盘提取码_利用审查元素自定义百度网盘提取码教程 无需工具
  15. CorelDRAW2022(CDR2022-64位),Win7 、Win10通用\免激活注册中文版安装图文教程
  16. 从百草园到三味书屋,从servlet到springmvc
  17. 证明三角形中cosA+cosB+cosC=1+4sin(A/2)sin(B/2)sin(C/2)
  18. 华为血压表WATCH D测量血压的数据可靠吗
  19. python输出字体的大小_Python之美——一只数据狗的笔记[长期更新]
  20. 系统调用【简单总结】

热门文章

  1. C语言,利用条件语句判断数的奇偶性。
  2. c语言 字符去重复以及冒泡排序
  3. C#开发笔记之22-C#中的int、long、float、double等类型都占多少个字节的内存。
  4. C#LeetCode刷题之#819-最常见的单词(Most Common Word)
  5. Chrome和Firefox浏览器长截图
  6. 自学成为程序员_成为程序员不需要的10件事
  7. postgresql学习_在PostgreSQL中学习这些快速技巧
  8. 笛卡尔函数_笛卡尔,伯克利和函数式React式编程
  9. 记录一次网盘资源不给提取码的经历!另类编程思维,Python破之!
  10. Pycharm代码格式化快捷键及其设置方法