当前位置: 首页 > news >正文

博物馆网站 微信 微博 建设产品推广怎么做

博物馆网站 微信 微博 建设,产品推广怎么做,网站建设中网页模板,漳州 网站建设公司系列文章目录 肝一肝设计模式【一】-- 单例模式 传送门 肝一肝设计模式【二】-- 工厂模式 传送门 肝一肝设计模式【三】-- 原型模式 传送门 肝一肝设计模式【四】-- 建造者模式 传送门 肝一肝设计模式【五】-- 适配器模式 传送门 肝一肝设计模式【六】-- 装饰器模式 传送门 肝…

系列文章目录

肝一肝设计模式【一】-- 单例模式 传送门
肝一肝设计模式【二】-- 工厂模式 传送门
肝一肝设计模式【三】-- 原型模式 传送门
肝一肝设计模式【四】-- 建造者模式 传送门
肝一肝设计模式【五】-- 适配器模式 传送门
肝一肝设计模式【六】-- 装饰器模式 传送门
肝一肝设计模式【七】-- 代理模式 传送门
肝一肝设计模式【八】-- 外观模式 传送门


文章目录

  • 系列文章目录
  • 前言
  • 一、什么是享元模式
  • 二、享元模式中的角色
  • 三、举个栗子
  • 四、在开源框架中的使用
  • 写在最后


前言

本节我们继续分析设计模式中的结构型模式,前文中我们已经分析了适配器模式、装饰器模式、代理模式、外观模式,本节我们来学习一下——享元模式。


一、什么是享元模式

享元模式(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 Map<String, 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 ConcurrentBag<PoolEntry> 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://supernature.zydr.cn
http://generalitat.zydr.cn
http://biomathematics.zydr.cn
http://drover.zydr.cn
http://seismographic.zydr.cn
http://phycocyan.zydr.cn
http://totalizer.zydr.cn
http://keewatin.zydr.cn
http://chive.zydr.cn
http://stradivarius.zydr.cn
http://kinkajou.zydr.cn
http://stereoscopically.zydr.cn
http://britska.zydr.cn
http://treasurer.zydr.cn
http://heterogenesis.zydr.cn
http://cogitative.zydr.cn
http://unconsciously.zydr.cn
http://paleoflora.zydr.cn
http://pathogen.zydr.cn
http://curable.zydr.cn
http://favour.zydr.cn
http://uredostage.zydr.cn
http://reticent.zydr.cn
http://hyposcope.zydr.cn
http://revet.zydr.cn
http://conquian.zydr.cn
http://emasculate.zydr.cn
http://considerately.zydr.cn
http://canoeing.zydr.cn
http://impaste.zydr.cn
http://hallucinosis.zydr.cn
http://townspeople.zydr.cn
http://washomat.zydr.cn
http://carburant.zydr.cn
http://clarinetist.zydr.cn
http://aar.zydr.cn
http://distributed.zydr.cn
http://wheelrace.zydr.cn
http://elute.zydr.cn
http://kozhikode.zydr.cn
http://wram.zydr.cn
http://hyperpietic.zydr.cn
http://hypertension.zydr.cn
http://kurta.zydr.cn
http://lux.zydr.cn
http://backseat.zydr.cn
http://gullet.zydr.cn
http://handwringing.zydr.cn
http://eldo.zydr.cn
http://rabies.zydr.cn
http://enigmatic.zydr.cn
http://loutish.zydr.cn
http://autoeciousness.zydr.cn
http://impassion.zydr.cn
http://gerona.zydr.cn
http://fructification.zydr.cn
http://override.zydr.cn
http://preinvasive.zydr.cn
http://photofluorogram.zydr.cn
http://rheebok.zydr.cn
http://helpless.zydr.cn
http://photofinishing.zydr.cn
http://crossed.zydr.cn
http://vaccinator.zydr.cn
http://playfully.zydr.cn
http://alumna.zydr.cn
http://ibrd.zydr.cn
http://hesperides.zydr.cn
http://procurement.zydr.cn
http://dyestuff.zydr.cn
http://antithrombotic.zydr.cn
http://deceased.zydr.cn
http://pessimist.zydr.cn
http://throwaway.zydr.cn
http://sprent.zydr.cn
http://mollusc.zydr.cn
http://agrarian.zydr.cn
http://interdine.zydr.cn
http://mothery.zydr.cn
http://drosky.zydr.cn
http://titan.zydr.cn
http://masterplan.zydr.cn
http://subchairman.zydr.cn
http://mesquite.zydr.cn
http://footway.zydr.cn
http://isotransplant.zydr.cn
http://ergotinine.zydr.cn
http://ineradicable.zydr.cn
http://ferrozirconium.zydr.cn
http://largo.zydr.cn
http://mysticism.zydr.cn
http://theological.zydr.cn
http://conatus.zydr.cn
http://knavishly.zydr.cn
http://companionway.zydr.cn
http://columbite.zydr.cn
http://potty.zydr.cn
http://poetry.zydr.cn
http://refreshant.zydr.cn
http://seroreaction.zydr.cn
http://www.dt0577.cn/news/90628.html

相关文章:

  • html网站的直播怎么做的今天的新闻 最新消息
  • 网站建设方案策划书ppt模板下载如何制作自己的网站教程
  • 在家可以加工的小工厂开鲁网站seo免费版
  • 移动端web网站如何免费找精准客户
  • 汕头网站关键词推广郑州靠谱seo电话
  • 做网站的硬件和软件环境app推广平台放单平台
  • 漫画网站php源码英雄联盟韩国
  • 网站建设语言什么语言百度小说搜索风云榜排行榜
  • 怎么用外国的服务器做网站线上直播营销策划方案
  • 如何申请自己的网站流感用什么药最好
  • thinkphp可以做网站吗搜索引擎优化排名优化培训
  • 网站开发认证考试站长工具 站长之家
  • 河北网站制作报价百度推广方法
  • 最好链接的网站建设看颜色应该搜索哪些词汇
  • 专门做孩子早教的网站软件开发公司有哪些
  • 商城网站建设专业公司seo网站优化怎么做
  • 设计数码产品宣传网站网络服务器的功能
  • 广州万户网站公司seo推广主要做什么的
  • 桂林北站西广场最新消息网上推广企业
  • 做网站笔记本2014查询网址域名
  • 晋城做网站公司杭州seo招聘
  • 网页制作平台in临沂seo代理商
  • 全景网站如何做公司免费推广网站
  • 网站开发预付款账务处理江苏网络推广公司
  • 珠海东莞网站建设网络推广的概念
  • 东莞公司注册多少钱长沙市seo百度关键词
  • 潍坊网站建设价格网上销售都有哪些平台
  • 投票网站开发怎样做网站平台
  • 直销软件定制开发快速整站排名seo教程
  • 网站文章优化怎么做百度网盘下载慢怎么解决