一、什么是享元模式

  Flyweight模式也叫享元模式,是构造型模式之 一,它通过与其他类似对象共享数据来减小内存 占用。

二、享元模式的结构

三、享元模式的角色和职责

  抽象享元角色: 所有具体享元类的父类,规定一些需要实现的公共接口。

  具体享元角色:     抽象享元角色的具体实现类,并实现了抽象享元角色规定的方法。

   享元工厂角色:    负责创建和管理享元角色。

没用享元模式前

  1. //我的性格
  2. public class MyCharacter {
  3. private char mychar;
  4.  
  5. public MyCharacter(char mychar) {
  6. this.mychar = mychar;
  7. }
  8.  
  9. public void display() {
  10. System.out.println(mychar);
  11. }
  12. }

我的性格的工厂

  1. import java.util.HashMap;
  2. import java.util.Map;
  3.  
  4. //我的性格的工厂
  5. public class MyCharacterFactory {
  6. private Map<Character,MyCharacter> pool;
  7.  
  8. public MyCharacterFactory() {
  9. pool = new HashMap<Character,MyCharacter>();
  10. }
  11.  
  12. public MyCharacter getMyCharacter(Character character) {
  13. MyCharacter myChar = pool.get(character);
  14. if(myChar == null) {
  15. myChar = new MyCharacter(character);
  16. pool.put(character, myChar);
  17. }
  18. return myChar;
  19. }
  20. }

测试

  1. public class MainClass {
  2.  
  3. public static void main(String[] args) {
  4. // MyCharacter myChar1 = new MyCharacter('a');
  5. // MyCharacter myChar2 = new MyCharacter('b');
  6. // MyCharacter myChar3 = new MyCharacter('a');
  7. // MyCharacter myChar4 = new MyCharacter('d');
  8. //
  9. // myChar1.display();
  10. // myChar2.display();
  11. // myChar3.display();
  12. // myChar4.display();
  13. //
  14. // if(myChar1 == myChar3) {
  15. // System.out.println("true");
  16. // } else {
  17. // System.out.println("false");
  18. // }
  19. //1.创建MyCharacter工厂
  20. MyCharacterFactory factory = new MyCharacterFactory();
  21.  
  22. //2.从工厂中取出相应的MyCharacter
  23. MyCharacter myChar1 = factory.getMyCharacter('a');
  24. MyCharacter myChar2 = factory.getMyCharacter('b');
  25. MyCharacter myChar3 = factory.getMyCharacter('a');
  26. MyCharacter myChar4 = factory.getMyCharacter('d');
  27.  
  28. myChar1.display();
  29. myChar2.display();
  30. myChar3.display();
  31. myChar4.display();
  32.  
  33. if(myChar1 == myChar3) {
  34. System.out.println("true");
  35. } else {
  36. System.out.println("false");
  37. }
  38. }
  39. }

===============================================================

  1. public class Person {
  2. private String name;
  3. private int age;
  4. private String sex;
  5.  
  6. public Person(String name, int age, String sex) {
  7. super();
  8. this.name = name;
  9. this.age = age;
  10. this.sex = sex;
  11. }
  12.  
  13. public Person() {
  14.  
  15. }
  16.  
  17. public String getName() {
  18. return name;
  19. }
  20. public void setName(String name) {
  21. this.name = name;
  22. }
  23. public int getAge() {
  24. return age;
  25. }
  26. public void setAge(int age) {
  27. this.age = age;
  28. }
  29. public String getSex() {
  30. return sex;
  31. }
  32. public void setSex(String sex) {
  33. this.sex = sex;
  34. }
  35. }

老师

  1. public class Teacher extends Person {
  2. private String number;
  3.  
  4. public String getNumber() {
  5. return number;
  6. }
  7.  
  8. public void setNumber(String number) {
  9. this.number = number;
  10. }
  11.  
  12. public Teacher(String name, int age, String sex,String number) {
  13. super(name, age, sex);
  14. this.number = number;
  15. }
  16.  
  17. public Teacher() {
  18. super();
  19. }
  20. }

老师工厂

  1. import java.util.HashMap;
  2. import java.util.Map;
  3. //老师工厂
  4. public class TeacherFactory {
  5. private Map<String,Teacher> pool;
  6.  
  7. public TeacherFactory() {
  8. pool = new HashMap<String,Teacher>();
  9. }
  10.  
  11. public Teacher getTeacher(String number) {
  12. Teacher teacher = pool.get(number);
  13. if(teacher == null) {
  14. teacher = new Teacher();
  15. teacher.setNumber(number);
  16. pool.put(number, teacher);
  17. }
  18. return teacher;
  19. }
  20. }

测试方法

  1. public class MainClass {
  2. public static void main(String[] args) {
  3. TeacherFactory factory = new TeacherFactory();
  4. Teacher teacher1 = factory.getTeacher("0102034");
  5. Teacher teacher2 = factory.getTeacher("0102035");
  6. Teacher teacher3 = factory.getTeacher("0102034");
  7. Teacher teacher4 = factory.getTeacher("0102037");
  8.  
  9. System.out.println(teacher1.getNumber());
  10. System.out.println(teacher2.getNumber());
  11. System.out.println(teacher3.getNumber());
  12. System.out.println(teacher4.getNumber());
  13.  
  14. if(teacher1 == teacher3) {
  15. System.out.println("true");
  16. } else {
  17. System.out.println("false");
  18. }
  19. }
  20. }

10享元模式Flyweight的更多相关文章

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

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

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

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

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

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

  4. 享元模式 FlyWeight 结构型 设计模式(十五)

    享元模式(FlyWeight)  “享”取“共享”之意,“元”取“单元”之意. 意图 运用共享技术,有效的支持大量细粒度的对象. 意图解析 面向对象的程序设计中,一切皆是对象,这也就意味着系统的运行将 ...

  5. 享元模式-Flyweight(Java实现)

    享元模式-Flyweight 享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用. 本文中的例子如下: 使用享元模式: 小明想看编程技术的书, ...

  6. Java享元模式(Flyweight Pattern)

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

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

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

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

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

  9. 享元模式 - Flyweight

    Flyweight(享元模式) 定义 GOF:运用共享技术有效地支持大量细粒度的对象. GOF的定义比较专业化,通俗来说,当你有大量相似的实例时,你把其中相同的实例取出来共享. 例子 在你的游戏场景中 ...

随机推荐

  1. unity中尽量规避的C#写法

    首先想到的也就是重名的问题. 创建C#脚本的时候,引擎会搜索所有的文件夹里已有的C#脚本,若已经存在这个名字的脚本文件,那么系统就会报错:    再者,类名和方法名不能相同,理解来就是,方法名和类名相 ...

  2. 工作笔记—新浪微博Oauth2.0授权 获取Access Token (java)

    java发送新浪微博,一下博客从注册到发布第一条微博很详细 利用java语言在eclipse下实现在新浪微博开发平台发微博:http://blog.csdn.net/michellehsiao/art ...

  3. C# 调用windows api 操作鼠标、键盘、窗体合集...更新中

    鼠标操作window窗体合集...更新中 1.根据句柄查找窗体 引自http://www.2cto.com/kf/201410/343342.html 使用SPY++工具获取窗体   首先打开spy+ ...

  4. Tidis单机部署

    拉取镜像 docker pull yongman/tidis:latest docker pull pingcap/tikv docker pull pingcap/pd 运行pd,由于Raft算法3 ...

  5. RouterOS双线进行IP分流上网

    环境: 1.第一条:电信静态IP,一级路由分配的IP:第二条:移动光纤 2.通过指定某些IP走电信,某些走移动 注意: 1.当有多条线路进行NAT伪装时,Out. Interface这个必须选择具体的 ...

  6. .NetCore中EFCore的使用整理(二)-关联表查询

    EF常用处理关联加载的方式有3中:延迟加载(Lazy Loading).贪婪加载 (Eager Loading)以及显示加载. 一.EF Core  1.1 1.当前的版本,还不支持延迟加载(Lazy ...

  7. vs2013修改书签(vs书签文件位置)

    visual studio 2013 的书签功能很好用,可以记录一些代码的位置:方便查阅: 不过当项目被他人修改过后,svn update 更新过后,书签的文件行号不变,但是已经不再是原来记录的哪一行 ...

  8. 推荐一款在线编辑JSON的网站

    推荐一款在线编辑JSON的网站 https://github.com/DavidDurman/FlexiJsonEditor 开源地址:https://github.com/DavidDurman/F ...

  9. 关于VIM自动缩进失效(filetype indent on无效)的详细分析

    关于VIM自动缩进失效(filetype indent on无效)的详细分析 set filetype=xml filetype indent on 执行对齐命令:ggvG

  10. linux 切分文件

    linux经常需要处理文件,如果文件比较大,那么需要切分成为若干的小文件再处理. 命令:split 比如有一个文件: ll -h 1431531915758 -rw-r--r-- 1 ticketde ...