获胜者网站建设旅游网页素材
news/
2025/10/3 18:28:22/
文章来源:
获胜者网站建设,旅游网页素材,网站规划和建设进度,程序外包平台目录
1、享元模式#xff08;Flyweight Pattern#xff09;含义
2、享元模式的UML图学习
3、享元模式的应用场景
4、享元模式的优缺点
5、C实现享元模式的简单实例 1、享元模式#xff08;Flyweight Pattern#xff09;含义 享元模式#xff08;Flyweight#xff09…目录
1、享元模式Flyweight Pattern含义
2、享元模式的UML图学习
3、享元模式的应用场景
4、享元模式的优缺点
5、C实现享元模式的简单实例 1、享元模式Flyweight Pattern含义 享元模式Flyweight运用共享技术有效地支持大量细粒度地对象。 1享元模式Flyweight Pattern是一种结构型设计模式旨在通过共享对象来最大程度地减少内存使用和提高性能。它适用于存在大量细粒度对象且这些对象之间有许多共享状态的情况。
2在享元模式中将对象分为两种状态内部状态Intrinsic State和外部状态Extrinsic State。内部状态是对象固有的、不会随着外部环境变化而变化的状态可以被多个对象共享而外部状态是对象依赖的、可能随着外部环境变化而变化的状态每个对象都需要单独维护。
3享元模式的核心思想是将可共享的内部状态从具体对象中提取出来并将其存储在一个享元池或缓存中。当需要创建对象时先检查享元池中是否已经存在相应的享元对象如果存在则直接返回如果不存在则创建新的享元对象并放入享元池中。客户端通过享元工厂来获取或操作享元对象同时传递外部状态给享元对象进行处理。 2、享元模式的UML图学习 在享元模式中主要包含以下几个角色
1享元工厂Flyweight Factory负责创建和管理享元对象。它维护一个享元池或缓存用于存储已经创建的享元对象并根据客户端的请求返回相应的享元对象。
2抽象享元Flyweight定义了享元对象的接口声明了享元对象可以接收的外部状态参数。
3具体享元Concrete Flyweight实现了抽象享元接口同时也包含内部状态。具体享元对象需要注意内部状态和外部状态的分离确保内部状态是可共享的。
4UnshareConcreteFlyweight是指那些不需要共享地Flyweight子类。因为Flyweight接口共享成为可能但它并不强制共享解决那些不需要共享对象地问题。
5客户端Client通过享元工厂来获取或操作享元对象。客户端通常会维护一些外部状态并将其传递给享元对象进行处理。 3、享元模式的应用场景
1系统中存在大量相似对象且创建和销毁这些对象会消耗大量资源时可以考虑使用享元模式来共享对象。
2对象的状态可以分为内部状态和外部状态且内部状态相对稳定不变而外部状态可变时可以使用享元模式来共享内部状态减少对象的数量。 4、享元模式的优缺点
1优点
1节省内存通过共享对象减少了系统中对象的数量从而节省了内存空间。特别是当需要创建大量细粒度的对象时享元模式可以显著减少内存的消耗。
2提高性能由于共享对象可以被多个客户端共享因此可以减少对象的创建和销毁次数提高了系统的性能。
3支持可变状态和不可变状态享元模式将对象的状态分为内部状态和外部状态其中内部状态是不可变的而外部状态是可变的。这样可以在一定程度上支持对象的可变性同时保持了对象的共享性。
2缺点
1对象共享可能导致线程安全问题如果多个线程同时访问并修改了共享对象的外部状态就会出现线程安全问题。在使用享元模式时需要注意对共享对象的并发访问进行合理的同步控制。
2增加了系统的复杂性引入享元模式会增加系统的复杂性需要额外的工厂类来管理享元对象的创建和共享。这增加了代码的复杂性和维护成本。 总结 享元模式通过共享对象来减少系统中对象的数量从而节省了内存空间并提高了系统的性能。然而它也增加了系统的复杂性并可能引入线程安全问题。在使用享元模式时需要根据具体情况权衡利弊合理设计和管理共享对象。 5、C实现享元模式的简单实例 #include iostream
#include unordered_map// 抽象享元类
class Flyweight
{
public:virtual void operation(int extrinsicState) 0;
};// 具体享元类
class ConcreteFlyweight : public Flyweight
{
public:void operation(int extrinsicState) override {std::cout 具体享元对象外部状态 extrinsicState std::endl;}
};// 享元工厂类
class FlyweightFactory
{
private:std::unordered_mapint, Flyweight* flyweights;public:Flyweight* getFlyweight(int key){if (flyweights.find(key) flyweights.end()) {flyweights[key] new ConcreteFlyweight();}return flyweights[key];}
};int main()
{FlyweightFactory factory;Flyweight* fw1 factory.getFlyweight(1);fw1-operation(10);Flyweight* fw2 factory.getFlyweight(2);fw2-operation(20);Flyweight* fw3 factory.getFlyweight(1); // 从缓存中获取已有的享元对象fw3-operation(30);delete fw1;delete fw2;// 注意不要删除fw3因为它是从享元池中获取的对象由享元工厂负责管理和销毁return 0;
}在上述示例中通过享元工厂FlyweightFactory创建和管理享元对象ConcreteFlyweight。客户端根据需要获取具体的享元对象并传递外部状态给享元对象进行操作。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/926189.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!