网络建设的网站,下载app免费下载软件,网站建设维护的相关基本知识,网站分享平台系列文章目录
肝一肝设计模式【一】-- 单例模式 传送门 肝一肝设计模式【二】-- 工厂模式 传送门 肝一肝设计模式【三】-- 原型模式 传送门 肝一肝设计模式【四】-- 建造者模式 传送门 肝一肝设计模式【五】-- 适配器模式 传送门 肝一肝设计模式【六】-- 装饰器模式 传送门 肝…系列文章目录
肝一肝设计模式【一】-- 单例模式 传送门 肝一肝设计模式【二】-- 工厂模式 传送门 肝一肝设计模式【三】-- 原型模式 传送门 肝一肝设计模式【四】-- 建造者模式 传送门 肝一肝设计模式【五】-- 适配器模式 传送门 肝一肝设计模式【六】-- 装饰器模式 传送门 肝一肝设计模式【七】-- 代理模式 传送门 肝一肝设计模式【八】-- 外观模式 传送门 文章目录 系列文章目录前言一、什么是享元模式二、享元模式中的角色三、举个栗子四、在开源框架中的使用写在最后 前言
本节我们继续分析设计模式中的结构型模式前文中我们已经分析了适配器模式、装饰器模式、代理模式、外观模式本节我们来学习一下——享元模式。 一、什么是享元模式
享元模式Flyweight Pattern它旨在减少对象的内存消耗提高应用程序的性能。该模式通过共享尽可能多的细粒度对象来实现这一目标从而有效地支持大量细粒度的对象。
在享元模式中对象分为两种类型内部状态Intrinsic State和外部状态Extrinsic State。内部状态是对象可以共享的状态不依赖于对象的上下文而外部状态是对象特定的、依赖于对象的上下文的状态。
享元模式的核心思想是将对象的状态划分为内部状态和外部状态并且通过共享内部状态来减少对象的数量。
二、享元模式中的角色
享元模式包含以下几个角色
享元接口Flyweight定义享元对象的接口通过该接口可以接收和操作外部状态。具体享元ConcreteFlyweight实现享元接口包含内部状态可以被共享和复用。具体享元对象需要注意线程安全的处理。享元工厂FlyweightFactory负责创建和管理享元对象它维护一个享元池Flyweight Pool用于存储和复用已经创建的享元对象。当客户端请求一个享元对象时享元工厂会检查享元池中是否已经存在该对象如果存在则直接返回否则创建一个新的享元对象并放入享元池中。客户端Client使用享元模式的对象通过享元工厂获取享元对象并根据需要传递外部状态。
三、举个栗子
最近在玩王国之泪咱们就拿游戏来举个例子。ps塞尔达是天任天堂是宇宙的主宰 在游戏中我们会遇到很多怪物如果创建每个怪物都包含大量的数据例如位置、外观、属性等将会占用大量的内存。 而享元模式可以帮助我们减少内存消耗提高性能。
上代码
import java.util.HashMap;
import java.util.Map;// 怪物接口
interface Monster {void display();
}// 具体怪物类
class ConcreteMonster implements Monster {private String type;private String image; // 内部状态怪物图片public ConcreteMonster(String type) {this.type type;// 加载怪物图片这里简化为字符串this.image Image_ type;}public void display() {System.out.println(Type: type , Image: image);}
}// 怪物工厂
class MonsterFactory {private static MapString, Monster monsterMap new HashMap();public static Monster getMonster(String type) {if (monsterMap.containsKey(type)) {return monsterMap.get(type);} else {Monster monster new ConcreteMonster(type);monsterMap.put(type, monster);return monster;}}
}// 客户端代码
public class Client {public static void main(String[] args) {Monster monster1 MonsterFactory.getMonster(波克布林);Monster monster2 MonsterFactory.getMonster(丘丘);Monster monster3 MonsterFactory.getMonster(波克布林);Monster monster4 MonsterFactory.getMonster(丘丘);monster1.display(); // Type: 波克布林, Image: Image_波克布林monster2.display(); // Type: 丘丘, Image: Image_丘丘monster3.display(); // Type: 波克布林, Image: Image_波克布林monster4.display(); // Type: 丘丘, Image: Image_丘丘System.out.println(monster1 monster3: (monster1 monster3)); // true内部状态相同的对象被共享System.out.println(monster2 monster4: (monster2 monster4)); // true内部状态相同的对象被共享}
}
在上述示例中我们定义了一个怪物接口 Monster并实现了具体的怪物类 ConcreteMonster。ConcreteMonster 类包含了怪物的类型和内部状态 image在构造函数中根据类型加载怪物图片。
然后我们创建了怪物工厂 MonsterFactory通过该工厂可以获取怪物对象。在工厂中我们使用一个 monsterMap 来缓存已创建的怪物对象。如果请求的怪物对象已存在于缓存中则直接返回否则创建一个新的怪物对象并存入缓存。
在客户端代码中我们通过怪物工厂获取了不同类型的怪物对象并调用 display() 方法展示怪物的信息。注意相同类型的怪物对象被共享使用因为它们具有相同的内部状态。
四、在开源框架中的使用
数据库连接池就是一个常见的应用享元模式的例子其中HikariCP 是一个轻量级、高性能的数据库连接池框架它在内部使用了享元模式来管理连接对象的复用。
在 HikariCP 的源码中核心的享元模式应用是在 HikariPool 类中它是连接池的主要实现。下面是一个简化的代码示例展示了 HikariPool 中享元模式的部分实现
public class HikariPool {// 内部状态连接对象池private ConcurrentBagPoolEntry poolEntries;// ...public Connection getConnection() throws SQLException {// 从连接池中获取一个可用的连接PoolEntry entry poolEntries.borrow(timeoutMs);return wrapConnection(entry);}private Connection wrapConnection(PoolEntry entry) {// 对连接对象进行包装添加上下文信息Connection connection entry.connection;// ...return connection;}// ...private static class PoolEntry {// 内部状态数据库连接对象final Connection connection;// 外部状态是否被占用volatile boolean isMarkedInUse;// ...PoolEntry(Connection connection) {this.connection connection;}// ...}
}
在上述示例中HikariPool 类表示连接池的主要实现。poolEntries 是连接对象池其中的每个元素 PoolEntry 表示一个连接对象。PoolEntry 类中的 connection 属性表示数据库连接对象而 isMarkedInUse 属性表示连接是否被占用。
当调用 getConnection() 方法时HikariPool 会从连接池中获取一个可用的连接对象并调用 wrapConnection() 方法对连接进行包装添加上下文信息等处理。
在 PoolEntry 类中connection 属性表示数据库连接对象而 isMarkedInUse 属性用于标记连接是否被占用。这个外部状态的管理使得连接对象可以在不同的上下文中被复用。
由于源码非常复杂上述示例只是简化了部分代码真实的 HikariCP 源码中还包含了许多其他功能和优化策略。 写在最后
享元模式可以有效地节省内存空间特别是在需要创建大量细粒度对象时。通过共享内部状态可以减少对象的数量提高应用程序的性能。然而享元模式的使用需要权衡内部状态和外部状态的划分以及对线程安全的处理因为共享的对象可能被多个线程同时访问。
享元模式的优点
内存优化享元模式通过共享对象的方式减少了内存的使用。相同的对象只在内存中存储一份多个相似的对象可以共享相同的状态从而减少了对象的数量和内存占用。性能提升由于享元模式减少了对象的数量从而减少了对象的创建和销毁的开销提高了系统的性能。特别是在需要大量创建对象的场景下享元模式可以显著减少系统的开销。状态外部化享元模式将对象的内部状态和外部状态分离内部状态共享外部状态由客户端管理。这样可以简化对象的状态管理提高系统的可维护性和灵活性。
享元模式的缺点
对象共享可能引发线程安全问题由于多个线程共享相同的对象可能需要额外的同步措施来保证线程安全性。在多线程环境下需要注意对共享对象的访问控制以避免并发问题。对象共享可能导致代码复杂性增加享元模式需要对对象的内部状态和外部状态进行区分和管理可能会增加代码的复杂性。这需要在设计和实现过程中进行权衡和折衷。 文章转载自: http://www.morning.mlpch.cn.gov.cn.mlpch.cn http://www.morning.fkflc.cn.gov.cn.fkflc.cn http://www.morning.ygkb.cn.gov.cn.ygkb.cn http://www.morning.jtfsd.cn.gov.cn.jtfsd.cn http://www.morning.jtmrx.cn.gov.cn.jtmrx.cn http://www.morning.txzqf.cn.gov.cn.txzqf.cn http://www.morning.datadragon-auh.cn.gov.cn.datadragon-auh.cn http://www.morning.pgmbl.cn.gov.cn.pgmbl.cn http://www.morning.wsxxq.cn.gov.cn.wsxxq.cn http://www.morning.qgbfx.cn.gov.cn.qgbfx.cn http://www.morning.jcbjy.cn.gov.cn.jcbjy.cn http://www.morning.ltksw.cn.gov.cn.ltksw.cn http://www.morning.yjfzk.cn.gov.cn.yjfzk.cn http://www.morning.pwlxy.cn.gov.cn.pwlxy.cn http://www.morning.wflpj.cn.gov.cn.wflpj.cn http://www.morning.bwygy.cn.gov.cn.bwygy.cn http://www.morning.bqpg.cn.gov.cn.bqpg.cn http://www.morning.qrmyd.cn.gov.cn.qrmyd.cn http://www.morning.dmnqh.cn.gov.cn.dmnqh.cn http://www.morning.twwzk.cn.gov.cn.twwzk.cn http://www.morning.yxlhz.cn.gov.cn.yxlhz.cn http://www.morning.bwzzt.cn.gov.cn.bwzzt.cn http://www.morning.xpmhs.cn.gov.cn.xpmhs.cn http://www.morning.rgmls.cn.gov.cn.rgmls.cn http://www.morning.ghryk.cn.gov.cn.ghryk.cn http://www.morning.jxltk.cn.gov.cn.jxltk.cn http://www.morning.brbnc.cn.gov.cn.brbnc.cn http://www.morning.hnrls.cn.gov.cn.hnrls.cn http://www.morning.pznhn.cn.gov.cn.pznhn.cn http://www.morning.nxbsq.cn.gov.cn.nxbsq.cn http://www.morning.jgncd.cn.gov.cn.jgncd.cn http://www.morning.hxbps.cn.gov.cn.hxbps.cn http://www.morning.sblgt.cn.gov.cn.sblgt.cn http://www.morning.btqqh.cn.gov.cn.btqqh.cn http://www.morning.nmkfy.cn.gov.cn.nmkfy.cn http://www.morning.btgxf.cn.gov.cn.btgxf.cn http://www.morning.xinyishufa.cn.gov.cn.xinyishufa.cn http://www.morning.nkkpp.cn.gov.cn.nkkpp.cn http://www.morning.gprzp.cn.gov.cn.gprzp.cn http://www.morning.wyjhq.cn.gov.cn.wyjhq.cn http://www.morning.tmxtr.cn.gov.cn.tmxtr.cn http://www.morning.thjqk.cn.gov.cn.thjqk.cn http://www.morning.pcwzb.cn.gov.cn.pcwzb.cn http://www.morning.dnqlba.cn.gov.cn.dnqlba.cn http://www.morning.xiaobaixinyong.cn.gov.cn.xiaobaixinyong.cn http://www.morning.fkflc.cn.gov.cn.fkflc.cn http://www.morning.mzpd.cn.gov.cn.mzpd.cn http://www.morning.wsnjn.cn.gov.cn.wsnjn.cn http://www.morning.czrcf.cn.gov.cn.czrcf.cn http://www.morning.tbhlc.cn.gov.cn.tbhlc.cn http://www.morning.xqcbz.cn.gov.cn.xqcbz.cn http://www.morning.pnmnl.cn.gov.cn.pnmnl.cn http://www.morning.dhrbj.cn.gov.cn.dhrbj.cn http://www.morning.skrrq.cn.gov.cn.skrrq.cn http://www.morning.rcklc.cn.gov.cn.rcklc.cn http://www.morning.yrjkz.cn.gov.cn.yrjkz.cn http://www.morning.ktmpw.cn.gov.cn.ktmpw.cn http://www.morning.yhdqq.cn.gov.cn.yhdqq.cn http://www.morning.brjq.cn.gov.cn.brjq.cn http://www.morning.yqmmh.cn.gov.cn.yqmmh.cn http://www.morning.ghjln.cn.gov.cn.ghjln.cn http://www.morning.fsqbx.cn.gov.cn.fsqbx.cn http://www.morning.rgtp.cn.gov.cn.rgtp.cn http://www.morning.ummpdl.cn.gov.cn.ummpdl.cn http://www.morning.snxbf.cn.gov.cn.snxbf.cn http://www.morning.wjmb.cn.gov.cn.wjmb.cn http://www.morning.ydrml.cn.gov.cn.ydrml.cn http://www.morning.gpnwq.cn.gov.cn.gpnwq.cn http://www.morning.ljjmr.cn.gov.cn.ljjmr.cn http://www.morning.wgxtz.cn.gov.cn.wgxtz.cn http://www.morning.pshpx.cn.gov.cn.pshpx.cn http://www.morning.kyzxh.cn.gov.cn.kyzxh.cn http://www.morning.kbqqn.cn.gov.cn.kbqqn.cn http://www.morning.gmysq.cn.gov.cn.gmysq.cn http://www.morning.wnhml.cn.gov.cn.wnhml.cn http://www.morning.qkgwz.cn.gov.cn.qkgwz.cn http://www.morning.mftdq.cn.gov.cn.mftdq.cn http://www.morning.gxfpk.cn.gov.cn.gxfpk.cn http://www.morning.zmlnp.cn.gov.cn.zmlnp.cn http://www.morning.bkfdf.cn.gov.cn.bkfdf.cn