设计模式_享元模式(15)
来源:互联网 发布:java 获取服务器ip 编辑:程序博客网 时间:2024/05/17 05:02
- 什么是享元模式
- 享元模式的例子
- 享元模式的优缺点
- 享元模式使用场景
- 闲言碎语
什么是享元模式
在日常生活中我们在不同的场景中可能会用到相同的东西,例如打火机,我们在点烟和生火做饭的时候都需要用到它.但实际上我们不能为此配备两个打火机,而是只需要一个打火机便可以满足我们的需求.同理,在程序中我们也可能在不同的场景使用到同一个对象,当然我们为其都建立一个对象是完全可以的.但是如果场景过多的话那么就需要建立很多相同的对象,这对系统来说是一个不小的负担.此时,为了解决这个问题我们就需要用到享元模式.
意图:运用共享技术有效地支持大量细粒度的对象。
主要解决:在有大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建。
- FlyWeight:享元接口或者(抽象享元类),定义共享接口
- ConcreteFlyWeight:具体享元类,该类实例将实现共享
- UnSharedConcreteFlyWeight:非共享享元实现类(由于本文实例原因,省略去掉)
- FlyWeightFactory:享元工厂类,控制实例的创建和共享
享元模式的例子
接口
package com.designPattern.flyweight;/** * 享元模式的接口 * * @author Jason * */public interface Flyweight {public void use();// 对物品的使用方法}
实体对象
package com.designPattern.flyweight;/** * 可以具体的代指任务物品的基类 * * @author Jason * */public class Goods implements Flyweight {private String name;public Goods(String name) {System.out.println("创建" + name);this.name = name;}@Overridepublic void use() {System.out.println(name + "被使用");}}
工厂类
package com.designPattern.flyweight;import java.util.Hashtable;/** * 物品的工厂类,负责物品的维护 * * @author Jason * */public class GoodsFactory {// 负责对物品的存储private Hashtable<String, Flyweight> flyweights = new Hashtable<String, Flyweight>();// 取得对应的物品,如果没有则进行创建public Flyweight getFlyweight(String name) {if (name == null) {return null;}Flyweight flyweight = flyweights.get(name);if (flyweight == null) {flyweight = new Goods(name);flyweights.put(name, flyweight);}return flyweight;}public int getSize() {return flyweights.size();}}
测试类
package com.designPattern.flyweight;import org.junit.Test;/** * 测试类 * * @author Jason * */public class TestCase {@Testpublic void test() {GoodsFactory factory = new GoodsFactory();Flyweight flyweight1 = factory.getFlyweight("剪刀");// 创建剪刀对象Flyweight flyweight2 = factory.getFlyweight("剪刀");// 不创建剪刀对象System.out.println(flyweight1 == flyweight2);// 判断取得的物品是否相同}}
享元模式的优缺点
优点
享元模式的优点在于它大幅度地降低内存中对象的数量
缺点
享元模式使得系统更加复杂。为了使对象可以共享,需要将一些状态外部化,这使得程序的逻辑复杂化。
享元模式将享元对象的状态外部化,而读取外部状态使得运行时间稍微变长。
享元模式使用场景
享元模式由于其共享的特征,可以在任何“池”中操作,比如:线程池,数据库连接池。
String类的设计也是享元模式。
闲言碎语
这是最简单的使用,在日常开发中享元模式必然会结合其他的模式一起组合使用.很少会单独出现!
阅读全文
0 0
- 设计模式_享元模式(15)
- 大话设计模式_享元模式
- 设计模式_享元模式
- java设计模式_享元模式
- 设计模式_享元模式
- Java设计模式_(结构型)_享元模式
- Integer注意_享元设计模式
- 设计模式:26 项目多也别傻做_享元模式
- 23种设计模式之_享元模式
- java设计模式13_享元模式
- Javascript设计模式-15-享元模式
- Java设计模式_结构型_享元模式_实现单元的共享
- 设计模式---享元模式
- 设计模式 享元模式
- 设计模式 - 享元模式
- 设计模式:享元模式
- 设计模式 - 享元模式
- 设计模式-享元模式
- 扑克牌顺子java实现
- Java简单使用Redis.
- 窗体间和自定义控件的传值
- 树状数组入门
- JAR概念和jar命令
- 设计模式_享元模式(15)
- 启动Django服务让其他电脑可访问
- set用法
- [POJ3648] 参加婚礼
- hc-05蓝牙模块与arduino连接实现手机控制蓝牙智能小车
- python datetime.timedelta的日期计算
- jzoj 2017.10.07 模拟赛
- 3天学会TensorFlow | 香港科技大学
- 让孩子进阶中产的唯一路径是编程?