一、什么是享元模式

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

二、享元模式的结构

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

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

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

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

没用享元模式前

 //我的性格
public class MyCharacter {
private char mychar; public MyCharacter(char mychar) {
this.mychar = mychar;
} public void display() {
System.out.println(mychar);
}
}

我的性格的工厂

 import java.util.HashMap;
import java.util.Map; //我的性格的工厂
public class MyCharacterFactory {
private Map<Character,MyCharacter> pool; public MyCharacterFactory() {
pool = new HashMap<Character,MyCharacter>();
} public MyCharacter getMyCharacter(Character character) {
MyCharacter myChar = pool.get(character);
if(myChar == null) {
myChar = new MyCharacter(character);
pool.put(character, myChar);
}
return myChar;
}
}

测试

 public class MainClass {

     public static void main(String[] args) {
// MyCharacter myChar1 = new MyCharacter('a');
// MyCharacter myChar2 = new MyCharacter('b');
// MyCharacter myChar3 = new MyCharacter('a');
// MyCharacter myChar4 = new MyCharacter('d');
//
// myChar1.display();
// myChar2.display();
// myChar3.display();
// myChar4.display();
//
// if(myChar1 == myChar3) {
// System.out.println("true");
// } else {
// System.out.println("false");
// }
//1.创建MyCharacter工厂
MyCharacterFactory factory = new MyCharacterFactory(); //2.从工厂中取出相应的MyCharacter
MyCharacter myChar1 = factory.getMyCharacter('a');
MyCharacter myChar2 = factory.getMyCharacter('b');
MyCharacter myChar3 = factory.getMyCharacter('a');
MyCharacter myChar4 = factory.getMyCharacter('d'); myChar1.display();
myChar2.display();
myChar3.display();
myChar4.display(); if(myChar1 == myChar3) {
System.out.println("true");
} else {
System.out.println("false");
}
}
}

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

 public class Person {
private String name;
private int age;
private String sex; public Person(String name, int age, String sex) {
super();
this.name = name;
this.age = age;
this.sex = sex;
} public Person() { } public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}

老师

 public class Teacher extends Person {
private String number; public String getNumber() {
return number;
} public void setNumber(String number) {
this.number = number;
} public Teacher(String name, int age, String sex,String number) {
super(name, age, sex);
this.number = number;
} public Teacher() {
super();
}
}

老师工厂

 import java.util.HashMap;
import java.util.Map;
//老师工厂
public class TeacherFactory {
private Map<String,Teacher> pool; public TeacherFactory() {
pool = new HashMap<String,Teacher>();
} public Teacher getTeacher(String number) {
Teacher teacher = pool.get(number);
if(teacher == null) {
teacher = new Teacher();
teacher.setNumber(number);
pool.put(number, teacher);
}
return teacher;
}
}

测试方法

 public class MainClass {
public static void main(String[] args) {
TeacherFactory factory = new TeacherFactory();
Teacher teacher1 = factory.getTeacher("0102034");
Teacher teacher2 = factory.getTeacher("0102035");
Teacher teacher3 = factory.getTeacher("0102034");
Teacher teacher4 = factory.getTeacher("0102037"); System.out.println(teacher1.getNumber());
System.out.println(teacher2.getNumber());
System.out.println(teacher3.getNumber());
System.out.println(teacher4.getNumber()); if(teacher1 == teacher3) {
System.out.println("true");
} else {
System.out.println("false");
}
}
}

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. python 爬虫不停换代理

    内网看到的一个小技巧,卧槽,感觉真TM厉害 函数均放到main函数内即可 def get_proxy(): url="http://www.xicidaili.com" req=u ...

  2. [ Visual Studio ] MSDN

    在 Visual Studio 中创建自定义项目和项模板 编写和重构代码 (C++) C# 指南 C#最新版本 使用 MSBuild 如何:管理编辑器模式,进入全屏模式编写代码 自定义代码折叠

  3. Linux学习笔记14—文件的压缩与打包

    1..gz   gzip 压缩工具压缩的文件 .bz2   bzip2 压缩工具压缩的文件 .tar   tar 打包程序打包的文件(tar并没有压缩功能,只是把一个目录合并成一个文件) .tar.g ...

  4. ORACLE中的字符串替换 replce、regexp_replace 和 translate

    一.语法 replace(str_source,str1,str2)  把 str_source 中 str1 字符串替换为 str2 字符串,当 str2 为 null 或'' 时,与下个作用相同 ...

  5. android:应用性能优化SparseArray

    HashMap是java里比较常用的一个集合类,我比较习惯用来缓存一些处理后的结果.最近在做一个Android项目,在代码中定义这样一个变量,实例化时,Eclipse却给出了一个 performanc ...

  6. extern字符串常量,宏定义字符串常量,怎么选

    在使用常量的时候,我看到主要有两种写法: #define RKLICURegexEnumerationOptionsErrorKey @"RKLICURegexEnumerationOpti ...

  7. boolean和Boolean, char和Character , byte和Byte, short和Short, int和Integer , long和Long , float和Float, double和Double的区别 , String和StringBuffer的区别

    Java提供两种不同的类型:引用类型和原始类型(内置类型).Int是java的原始数据类型,Integer是java为int提供的封装类. Java为每个原始数据类型提供了封装类. 其中原始数据类型封 ...

  8. MDX Cookbook 11 - 计算 Year Over Year 增长 (同比计算) ParallelPeriod

    这一小节主要介绍如何在一个平行期间的度量值,当前值的对比对象是指当前值的上一年,上一个季度或者其它时间级别上与当前值同一时间点上的的那个对象.有一个非常常见的需求就是对比上一年同一个时间点的某个值来判 ...

  9. Duplicate复制数据库并创建物理StandBy(pfile版本)

    1设定环境如下: Primary数据库 IP 172.17.22.16 SID orcl Standby数据库 IP 172.17.22.17 SID orcl 设置提示,以区分操作的位置 prima ...

  10. 启动Jupyter Notebook

    按照图所示,在命令下输入ipython notebook 即可启动Jupyter. 启动后的效果: