继续学习享元模式。。。

乍一看到享元的名字,一头雾水,学习了以后才觉得,这个名字确实比较适合这个模式。

享元,即共享对象的意思。

  举个例子,如果制作一个五子棋的游戏,如果每次落子都实例化一个对象的话,那么一个多人在线的游戏,要实例化的对象就无穷无尽,

为了避免这种情况的发生,我们可以怎么做呢。

  试想一下,如果有个盛放对象的容器,用到什么对象就拿出来,如果容器中没有要用到的对象,那么就创建新的对象,并放入容器中。

这样资源就会得到充分的利用,也避免频繁的创建对象,造成内存的浪费。

  享元模式,就是做到了对象的重复使用,减小内存占用。

  

下面直接上代码。依然是Java实现。

Person基类,定义一些人的基本信息。可以被其他关于人的类继承。

 public class Person {
private String name = "";
private int age = ;
private String sex = ""; public Person(String name, int age, String sex)
{
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;
}
}

Student类,继承了Person基类,拥有自己独立的方法,并加入了字段id。

 public class Student extends Person{
private String id = "";
public Student(String name, int age, String sex, String id){
super(name, age, sex);
this.id = id;
} public Student() {
super();
} public String getId() {
return id;
} public void setId(String id) {
this.id = id;
} public void studentSpeak()
{
System.out.println("我的学号是:" + id);
}
}

StudentFactory类,享元模式的核心类,有容器pool,有对象拿出来用,没有对象就创建对象。

 import java.util.HashMap;
import java.util.Map; public class StudentFactory {
private Map<String, Student> pool; public StudentFactory() {
pool = new HashMap<String, Student>();
} public Student getStudent(String id){
Student student = pool.get(id);
if(null == student){
student = new Student();
student.setId(id);
pool.put(id, student);
}
return student;
}
}

MainClass测试主类。

 public class MainClass {

     public static void main(String[] args) {
StudentFactory studentFactory = new StudentFactory();
Student student1 = studentFactory.getStudent("");
Student student2 = studentFactory.getStudent("");
Student student3 = studentFactory.getStudent("");
Student student4 = studentFactory.getStudent("");
student1.studentSpeak();
student2.studentSpeak();
student3.studentSpeak();
student4.studentSpeak();
if(student1 == student3){
System.out.println("=======同一个对象======");
}else {
System.out.println("--------不同对象-------");
}
}
}

测试结果。

由此可见,student1和student3是同一个对象。

此外还有一个概念需要注意一下,就是人们口中的对象池,对象池是享元模式的一个分支,但是和上边的享元模式还是有区别的。

区别就在于,对象池中的对象都是相同的,而以上的享元模式的对象是不同的,并用id做了区分。需要好好体会一下。

希望大家共同进步,每天学到一点,积少成多。

Sweet Dream!!!

(@WhiteTaken)设计模式学习——享元模式的更多相关文章

  1. python设计模式之享元模式

    python设计模式之享元模式 由于对象创建的开销,面向对象的系统可能会面临性能问题.性能问题通常在资源受限的嵌入式系统中出现,比如智能手机和平板电脑.大型复杂系统中也可能会出现同样的问题,因为要在其 ...

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

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

  3. 再起航,我的学习笔记之JavaScript设计模式16(享元模式)

    ### 享元模式 **享元模式(Flyweight):** 运用共享技术有效地支持大量的细粒度的对象,避免对象间拥有相同内容造成多余的开销. 上回我们在组合模式中创建了文章列表类,这次我们要向不同的文 ...

  4. Java进阶篇设计模式之七 ----- 享元模式和代理模式

    前言 在上一篇中我们学习了结构型模式的组合模式和过滤器模式.本篇则来学习下结构型模式最后的两个模式, 享元模式和代理模式. 享元模式 简介 享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能 ...

  5. Java设计模式之七 ----- 享元模式和代理模式

    前言 在上一篇中我们学习了结构型模式的组合模式和过滤器模式.本篇则来学习下结构型模式最后的两个模式, 享元模式和代理模式. 享元模式 简介 享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能 ...

  6. PHP设计模式之享元模式

    享元模式,"享元"这两个字在中文里其实并没有什么特殊的意思,所以我们要把它拆分来看."享"就是共享,"元"就是元素,这样一来似乎就很容易理解 ...

  7. 【GOF23设计模式】享元模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_享元模式.享元池.内部状态.外部状态.线程池.连接池 package com.test.flyweight; /** * ...

  8. 设计模式之享元模式(Flyweight)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  9. Head First设计模式之享元模式(蝇量模式)

    一.定义 享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能.这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式. ...

随机推荐

  1. css样式实现立方体制作

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  2. oop6 栈 界面

    作业要求 本次作业要求实现核心算法,请将表达式生成的代码及相关的检验.计算表达式结果的代码贴在博客中,并对代码进行必要的解释. 发表一篇博客,博客内容为:提供本次作业的github链接,本次程序运行的 ...

  3. GUI(JMenuBar+JMenu+JMenuItem)

    public class WindowMenu extends JFrame { JMenuBar menubar; JMenu menu,subMenu; JMenuItem item1,item2 ...

  4. Java 第六周总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰,内容覆盖 ...

  5. 201521123015 《Java程序设计》第3周学习总结

    本周学习总结 初学面向对象,会学习到很多碎片化的概念与知识.尝试学会使用思维导图将这些碎片化的概念.知识组织起来.请使用纸笔或者下面的工具画出本周学习到的知识点. 书面作业 Q1.代码阅读 publi ...

  6. 《JAVA程序设计》第11周学习总结

    1. 本章学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. synchronized方法/代码块 wait().notify()用法,生产者消费者例子 lock.condit ...

  7. 201521123121 《Java程序设计》第13周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 1.两类传输协议:TCP:UDP TCP/IP协议的名称中只有TCP这个协议名,但是在TCP/IP的传输层 ...

  8. Eclipse rap 富客户端开发总结(14) :rap 图片、数据缓存处理

    一.概述 在进行了 rap 的基本学习之后,您对 rap 的理解是否进入了更高的一个层次呢,个人觉得,对学习 rap 的人来说,进行 rap 的学习是一个探索的过程,在编程中不断的对其进行理解和分析, ...

  9. 快递鸟顺丰物流api接口对接多种方法整理

    目前很多自营电商平台.ERP系统.仓储系统.快递柜企业,对物流模块数据需求还是比较旺盛的.之前有介绍过简单的接口对接方法,这次给大家整理介绍两种快递数据的获取方法. 接口秘钥可以向顺丰公司申请,或者一 ...

  10. 数据库Mysql的安装及操作---数据引擎

    一.1.什么是数据           描述事物的符号记录称为数据.       2.什么是数据库         存放数据的仓库,只不过这个仓库在计算机上存储设备上. 二.Mysql的介绍     ...