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

国外photoshop素材网站永川网站制作联系电话

国外photoshop素材网站,永川网站制作联系电话,wifi管理网站,高端网站设计百家号设计模式14-享元模式 由来动机定义与结构代码推导特点享元模式的应用总结优点缺点使用享元模式的注意事项 由来动机 在很多应用中,可能会创建大量相似对象,例如在文字处理器中每个字符对象。在这些场景下,如果每个对象都独立存在&#xff0c…

设计模式14-享元模式

  • 由来动机
  • 定义与结构
  • 代码推导
  • 特点
  • 享元模式的应用
  • 总结
    • 优点
    • 缺点
    • 使用享元模式的注意事项

由来动机

在很多应用中,可能会创建大量相似对象,例如在文字处理器中每个字符对象。在这些场景下,如果每个对象都独立存在,将会导致巨大的内存开销。那么如何在避免大量颗粒度对象问题的同时,让外部客户程序仍然能够透明的使用面向对象的方式来进行操作呢?享元模式的主要动机是通过共享相似对象来减少内存使用,提高系统性能,来解决此类问题。

享元模式适用于以下情况:

  • 应用程序使用大量相同或相似对象。
  • 对象的大部分状态可以外部化,从而使得许多对象能够共享同一个实例。
  • 需要支持大量细粒度对象高效地共享和复用。

定义与结构

模式定义: 运用共享技术有效地支持大量细粒度的对象。–《设计模式》GoF

享元模式由以下几个主要角色组成:

  1. Flyweight(享元接口): 定义了对象的接口,可以接受外部状态。
  2. ConcreteFlyweight(具体享元): 实现Flyweight接口,并为内部状态(不变部分)进行存储。
  3. UnsharedConcreteFlyweight(非共享享元): 并不是所有的Flyweight子类都需要被共享,非共享Flyweight类可以实现Flyweight接口,但它们不是共享的。
  4. FlyweightFactory(享元工厂): 创建并管理Flyweight对象,确保合理地共享Flyweight。

以下是享元模式的UML图:
在这里插入图片描述

代码推导

下面我们通过C++代码示例来实现享元模式。

  1. 定义Flyweight接口:
class Flyweight {
public:virtual void operation(int extrinsicState) = 0;virtual ~Flyweight() = default;
};
  1. 实现具体享元类:
#include <iostream>class ConcreteFlyweight : public Flyweight {
private:int intrinsicState;public:ConcreteFlyweight(int state) : intrinsicState(state) {}void operation(int extrinsicState) override {std::cout << "Intrinsic State: " << intrinsicState << ", Extrinsic State: " << extrinsicState << std::endl;}
};
  1. 实现享元工厂类:
#include <unordered_map>
#include <memory>class FlyweightFactory {
private:std::unordered_map<int, std::shared_ptr<Flyweight>> flyweights;public:std::shared_ptr<Flyweight> getFlyweight(int key) {if (flyweights.find(key) == flyweights.end()) {flyweights[key] = std::make_shared<ConcreteFlyweight>(key);}return flyweights[key];}
};
  1. 使用享元模式:
int main() {FlyweightFactory factory;std::shared_ptr<Flyweight> fw1 = factory.getFlyweight(1);std::shared_ptr<Flyweight> fw2 = factory.getFlyweight(2);std::shared_ptr<Flyweight> fw3 = factory.getFlyweight(1); // Reuses the existing Flyweightfw1->operation(10);fw2->operation(20);fw3->operation(30);return 0;
}

特点

  1. 共享对象: 通过共享细粒度对象,减少内存使用,提高性能。
  2. 内部状态和外部状态: 将对象的状态分为内部状态和外部状态,内部状态存储在享元对象中,而外部状态由客户端传入。
  3. 不可变性: 享元对象是不可变的,确保共享时不会被其他对象修改。
  4. 工厂管理: 使用享元工厂管理享元对象的创建和共享,确保唯一实例。

享元模式的应用

享元模式在以下场景中非常有用:

  1. 文本处理: 文本编辑器中,每个字符都是一个对象,通过享元模式共享字符对象,减少内存消耗。
  2. 图形系统: 在图形系统中,大量相似的图形对象可以通过享元模式共享,例如树木、建筑物等。
  3. 缓存: 使用享元模式实现对象缓存,避免重复创建相同的对象。
  4. 游戏开发: 在游戏开发中,使用享元模式共享相同类型的游戏对象,例如敌人、子弹等,减少内存使用。

总结

  • 面对对象很好的解决了抽象性的问题,但是作为一个运行在机器中的程序实体我们需要考虑对象的代价问题。享元模式主要解决面向对象的代价问题,一般不触及面向对象的抽象性问题。
  • 享元模式采用对象共享的方法来降低系统中对象的个数,从而降低细粒度对象给系统带来的内存压力。在具体实践方面要注意对象状态的处理。
  • 对象的数量太大,从而导致对象内存开销加大,什么样的数量才算大?这需要我们仔细的根据具体应用情况进行评估,而不能评空臆断。

优点

  1. 减少内存消耗: 通过共享细粒度对象,享元模式大大减少了内存的使用。当有大量相似对象需要创建时,享元模式特别有效。
  2. 提升性能: 由于减少了内存使用,享元模式可以提升系统的性能,特别是在内存有限或系统资源紧张的情况下。
  3. 分离内部状态和外部状态: 享元模式将对象的状态分为内部状态(共享部分)和外部状态(非共享部分),使得对象更加轻量化。

缺点

  1. 复杂性增加: 享元模式引入了额外的复杂性,特别是在处理对象状态时,需要明确区分内部状态和外部状态。
  2. 维护困难: 享元模式需要维护一个共享对象的池,这增加了代码的复杂性和维护难度。
  3. 线程安全问题: 在多线程环境下,需要确保享元对象的线程安全性,可能需要引入额外的同步机制,影响性能。

使用享元模式的注意事项

  1. 区分内部状态和外部状态: 在使用享元模式时,需要明确区分哪些状态可以共享(内部状态),哪些状态是对象独有的(外部状态)。
  2. 适用场景: 享元模式适用于有大量相似对象的场景,例如图形系统、文本处理、游戏开发等。如果对象数量不多,或者对象之间差异较大,使用享元模式的意义不大。
  3. 线程安全: 在多线程环境下,共享的享元对象需要是线程安全的。可以使用锁(例如std::mutex)或者其他同步机制确保线程安全。
  4. 内存泄漏: 享元模式中的享元工厂负责管理共享对象,需要确保及时释放不再使用的共享对象,以避免内存泄漏。
  5. 性能权衡: 虽然享元模式可以减少内存使用,但也会引入一些性能开销,例如对象池的维护、同步机制的使用等。在设计时需要权衡这些开销。
http://www.yayakq.cn/news/563491/

相关文章:

  • 织梦商城网站源码深圳网络优化seo
  • 进入官方网站浏览器网站站内优化怎么做
  • 做网站 我们的工人怎么写企业网站管理中心
  • 企业网站怎么收录成都广告制作公司
  • 网站建设 引导企业网站怎么做的高大上
  • 注册公司后不营业有什么后果做移动网站优化快速
  • 做个网站一年要多少钱医美三方网站怎么做
  • 企业内部网站设计专业建设网站公司哪家好
  • 湖北网站优化公司wordpress分库技术
  • 湖南营销型网站建设 干净磐石网络小公司做网站赚钱吗
  • 小说网站开发成本wordpress加菜单
  • 广告制作网站源码seo专员的工作内容
  • 公共资源交易中心网站建设汇报网站如何不被收录
  • 做围棋题网站wordpress实现登录
  • 如何设计网站的首页网站制作备案上线流程
  • 邯郸网站建设纵横暴雪游戏
  • 网上做网站赚钱社交主题 wordpress
  • 网站如何做微信分享推广wordpress mp4
  • 微网站设计与开发是什么网站常见攻击
  • 建设银行首页 网站商城的网站建设
  • 嘉兴自助建站系统怎么做有邀请码的网站
  • 网站建设维护升级顺企网萍乡网站建设
  • 网站留言模板wordpress主题制作软件
  • 徐州城乡建设招投标网站怎么做网站开发
  • 专业网页网站设计图书网站建设没业务
  • 做爰网站下载工程公司工作总结
  • 天津建设网站需要的费用瑞安学校网站建设
  • 常州网站推广软件信息苏州网站设计
  • 有域名有空间如何做网站怎么开发直播平台
  • 怎样免费建立自己的网站学广告设计