(@WhiteTaken)设计模式学习——享元模式
继续学习享元模式。。。
乍一看到享元的名字,一头雾水,学习了以后才觉得,这个名字确实比较适合这个模式。
享元,即共享对象的意思。
举个例子,如果制作一个五子棋的游戏,如果每次落子都实例化一个对象的话,那么一个多人在线的游戏,要实例化的对象就无穷无尽,
为了避免这种情况的发生,我们可以怎么做呢。
试想一下,如果有个盛放对象的容器,用到什么对象就拿出来,如果容器中没有要用到的对象,那么就创建新的对象,并放入容器中。
这样资源就会得到充分的利用,也避免频繁的创建对象,造成内存的浪费。
享元模式,就是做到了对象的重复使用,减小内存占用。
下面直接上代码。依然是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)设计模式学习——享元模式的更多相关文章
- python设计模式之享元模式
python设计模式之享元模式 由于对象创建的开销,面向对象的系统可能会面临性能问题.性能问题通常在资源受限的嵌入式系统中出现,比如智能手机和平板电脑.大型复杂系统中也可能会出现同样的问题,因为要在其 ...
- 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern)
原文:乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) 作者:weba ...
- 再起航,我的学习笔记之JavaScript设计模式16(享元模式)
### 享元模式 **享元模式(Flyweight):** 运用共享技术有效地支持大量的细粒度的对象,避免对象间拥有相同内容造成多余的开销. 上回我们在组合模式中创建了文章列表类,这次我们要向不同的文 ...
- Java进阶篇设计模式之七 ----- 享元模式和代理模式
前言 在上一篇中我们学习了结构型模式的组合模式和过滤器模式.本篇则来学习下结构型模式最后的两个模式, 享元模式和代理模式. 享元模式 简介 享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能 ...
- Java设计模式之七 ----- 享元模式和代理模式
前言 在上一篇中我们学习了结构型模式的组合模式和过滤器模式.本篇则来学习下结构型模式最后的两个模式, 享元模式和代理模式. 享元模式 简介 享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能 ...
- PHP设计模式之享元模式
享元模式,"享元"这两个字在中文里其实并没有什么特殊的意思,所以我们要把它拆分来看."享"就是共享,"元"就是元素,这样一来似乎就很容易理解 ...
- 【GOF23设计模式】享元模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_享元模式.享元池.内部状态.外部状态.线程池.连接池 package com.test.flyweight; /** * ...
- 设计模式之享元模式(Flyweight)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- Head First设计模式之享元模式(蝇量模式)
一.定义 享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能.这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式. ...
随机推荐
- 201521123025《java程序设计》第8周学习总结
1. 本周学习总结 2.书面作业 Q1.List中指定元素的删除(题目4-1) public static List<String> convertStringToList(String ...
- 201521123036 《Java程序设计》第10周学习总结
本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 书面作业 本次PTA作业题集异常.多线程 finally 题目4-2 1.1 截图你的提交结果(出现学号) 1.2 ...
- Java十二周总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...
- 201521123032 《Java程序设计》第14周学习总结
0. 本周课程设计发布 Java课程设计 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. 2. 书面作业 1. MySQL数据库基本操作 建立数据库,将自己的姓 ...
- 201521123019 《java程序设计》 第14周学习总结
1. 本章学习总结 2. 书面作业 Q1. MySQL数据库基本操作 建立数据库,将自己的姓名.学号作为一条记录插入.(截图,需出现自己的学号.姓名) 在自己建立的数据库上执行常见SQL语句(截图) ...
- 201521123022 《Java程序设计》 第九周学习总结
1.本章学习总结 2. 书面作业 本次PTA作业题集异常 1.常用异常 题目5-1 Q1.1 截图你的提交结果(出现学号) Q1.2 自己以前编写的代码中经常出现什么异常.需要捕获吗(为什么)?应如何 ...
- Could not execute JDBC batch update; SQL [delete from role where roleId=?]; constraint [null]; neste
今天在写多个删除功能的时候出现了这么一个错误:意思是删除操作的时候,没有找到对应的外键. Cannot delete or update a parent row: a foreign key con ...
- Spring - bean的依赖关系(depends-on属性)
depends-on是bean标签的属性之一,表示一个bean对其他bean的依赖关系.乍一想,不是有ref吗?其实还是有区别的,<ref/>标签是一个bean对其他bean的引用,而de ...
- Linux 环境下 MySQ导入和导出MySQL的sql文件
将服务器上的文件导入或导出还需要使用工具传输到本机中,推荐使用winscp,与xshell搭配使用 1 导入数据库 两种方法 .首先建空数据库 mysql>create database abc ...
- 阿里云linux centos 一键部署web环境--图文详解
一.购买阿里云服务器ECS 1,登录阿里云,选择阿里云服务器ECS 2,创建实例 或 3,选好配置 4,完成配置 注:记住用户名和密码 二.一键配置linux环境 1,下载xshell,安装成功后,建 ...