享元模式
来源:互联网 发布:淘宝物流重量要填多少 编辑:程序博客网 时间:2024/05/12 11:43
一、什么是享元模式?
享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。
二、享元模式的角色和职责
1、抽象享元角色: 所有具体享元类的父类,规定一些实现的公共接口。
2、具体享元角色: 抽象享元角色的具体实现类,并实现抽象类中的方法。
3、享元工厂角色: 负责创建和管理享元角色。
三、优缺点及适应场景
优点:
1、它能够极大的减少系统中对象的个数。2、由于其使用了外部状态,各个外部状态之间相对独立,不会影响到内部状态,所以享元模式使得享元对象能够在不同的环境被共享。
缺点:
1、由于对外部状态和内部状态的区分,使得应用程序在某种程度上来说更加复杂化了。2、为了使对象可以共享,享元模式需要将享元对象的状态外部化,而读取外部状态使得运行时间变长。
适应场景:
针对享元模式的优点:
1、由于大量相同或者类似对象的使用,导致系统内存耗费严重。
2、大量内部状态可以转化为外部状态 ,可以将其转化并传入对象中。
四、具体代码:
/** * @Title: Person.java* @Package com.Flyweight* @Description: * @author xiaozhi * @date 2016年12月6日 下午6:35:29* @version V1.0 */package com.Flyweight;public class Person { private String name; private String sex; private String age; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public Person(String name, String sex, String age) { super(); this.name = name; this.sex = sex; this.age = age; } public Person() { }}
/** * @Title: Teacher.java* @Package com.Flyweight* @Description: TODO(用一句话描述该文件做什么)* @author xiaozhi * @date 2016年12月6日 下午6:39:17* @version V1.0 */package com.Flyweight;public class Teacher extends Person { private String num = null; public Teacher(String name, String sex, String age, String num) { super(name, sex, age); this.num = num; } public void setNum(String num) { this.num = num; } public Teacher() { }}
/** * @Title: TeacherFactory.java* @Package com.Flyweight* @Description: TODO(用一句话描述该文件做什么)* @author xiaozhi * @date 2016年12月6日 下午6:41:07* @version V1.0 */package com.Flyweight;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 num) { Teacher teacher = pool.get(num); if (teacher == null) { teacher = new Teacher(); teacher.setName(num); pool.put(num, teacher); } return teacher; }}
/** * @Title: MainClass.java* @Package com.Flyweight* @Description: 测试类* @author xiaozhi * @date 2016年12月6日 下午6:35:04* @version V1.0 */package com.Flyweight;public class MainClass { public static void main(String[] args) { TeacherFactory factory = new TeacherFactory(); Teacher t1 = factory.getTeacher("001"); Teacher t2 = factory.getTeacher("002"); Teacher t3 = factory.getTeacher("003"); Teacher t4 = factory.getTeacher("004"); System.out.println(t1.getName()); System.out.println(t2.getName()); System.out.println(t3.getName()); System.out.println(t4.getName()); if (t1 == t2) { System.out.println("true"); } else { System.out.println("false"); } }}
五、测试结果:
打折卖书赠送代金卷
0 0
- 深入浅出享元模式
- 享元模式
- 享元(FlyWeight)模式
- 享元模式
- 享元模式
- 享元模式
- 享元模式
- 享元模式Flyweight
- 享元模式
- 享元模式
- 享元模式
- FlyWeight 享元模式
- 享元模式(Flyweight)
- 享元模式
- 享元模式
- 享元模式
- 享元模式
- 享元模式 ---flyweight
- 基于WEB服务器CGI接口实现留言板功能
- CRM事件增强
- 【codeforces】678 F. Lena and Queries【线段树维护凸壳】
- Laravel5.3使用学习笔记---中间件
- Spring,SpringMvc ,struts比较
- 享元模式
- 十四周项目四(1) 矩阵相加
- 【C++】int转换为string的两种方法(to_string、字符串流)
- c语言(判断最大数)
- MongoDB基本操作
- 概率模型与计算机视觉
- 对运营越来越感兴趣
- 学习笔记之qt4程序中引入自定义窗口部件之单一继承方式
- poj 3590 The shuffle Problem(置换群的幂运算)