行业知识
C++设计模式之——享元模式详解和代码案例
2026-10-31 20:26:48
来源:互联网转载
文章目录
- C++中实现享元模式通常涉及以下几个关键部分:
- 一个简单的C++代码片段示例
- 享元模式的进一步说明
- C++享元模式代码案例——咖啡店订单系统
- 享元���式在现实世界的应用场景
C++中实现享元模式通常涉及以下几个关键部分:
享元模式(Flyweight Pattern)是一种用于性能优化的设计模式,它通过共享对象来有效支持大量的细粒度对象,以减少内存消耗。这种模式适用于那些对象中大部分状态可以外部化,而只有少量内部状态(不随环境改变而改变的状态)的对象。在C++中实现享元模式通常涉及以下几个关键部分:
- 抽象享元(Flyweight Interface):
定义了所有具体享元类共有的接口,通常包含内部状态和外部状态的操作方法。内部状态是可以共享的,而外部状态由客户端在每次调用时传入。
class IFlyweight {public: virtual ~IFlyweight() {} // 内部状态不变的操作 virtual void operation(const Context& context) const = 0;};- 具体享元(Concrete Flyweight):
实现了抽象享元接口,并存储内部状态。具体享元类的实例是可共享的。
class ConcreteFlyweight : public IFlyweight {private: std::string intrinsicState; // 内部状态public: ConcreteFlyweight(const std::string& state) : intrinsicState(state) {} void operation(const Context& context) const override { // 使用内部状态和外部状态进行操作 }};- 享元工厂(Flyweight Factory):
负责创建和管理享元对象。它确保当请求的是相同的内部状态时,不会创建多个具有相同内部状态的享元对象。
class FlyweightFactory {private: std::map flyweights;public: std::shared_ptr getFlyweight(const std::string& key) { if (flyweights.find(key) == flyweights.end()) { flyweights[key] = std::make_shared(key); } return flyweights[key]; }};一个简单的C++代码片段示例
下面是一个简单的C++代码片段示例,展示了如何使用享元模式:
#include #include #include #include // 抽象享元class IFlyweight {public: virtual ~IFlyweight() {} virtual void operation(const std::string& extrinsicState) const = 0;};// 具体享元class ConcreteFlyweight : public IFlyweight {private: std::string intrinsicState;public: ConcreteFlyweight(const std::string& state) : intrinsicState(state) {} void operation(const std::string& extrinsicState) const override { std::cout private: std::map if (flyweights.count(key) == 0) { flyweights[key] = std::make_shared FlyweightFactory factory; std::vector"state1", "state2", "state2"}; for (const auto& state : extrinsicStates) { auto flyweight = factory.getFlyweight("sharedState"); flyweight-operation(state); } return 0;}private: Texture texture; // 内部状态,表示字符图像纹理public: CharacterFlyweight(const Texture& tex) : texture(tex) {} void operation(const RenderingContext& context) const override { // 使用共享的纹理资源,根据context中的位置、旋转角度等绘制字符 }};class CharacterFactory {private: std::map if (characters.find(style) == characters.end()) { Texture tex = loadTexture(style.getFontFile()); // 加载图片资源 characters[style] = std::make_shared Point position; double rotation; float scale; // 其他外部状态...};int main() { CharacterFactory factory; // 渲染不同位置的同一种字符 CharacterStyle sharedStyle("Arial.ttf"); RenderingContext ctx1{Point{10, 20}, 0.0, 1.0}; RenderingContext ctx2{Point{30, 40}, 0.0, 1.0}; auto character = factory.getCharacter(sharedStyle); character-operation(ctx1); character-operation(ctx2); return 0;}public: virtual ~CoffeeFlavor() {} virtual void serve() const = 0;};// 具体享元类class ConcreteCoffeeFlavor : public CoffeeFlavor {public: explicit ConcreteCoffeeFlavor(const std::string& flavorName) : flavorName_(flavorName) {} void serve() const override { std::cout private: std::map if (flavors.find(flavor) == flavors.end()) { flavors[flavor] = std::make_shared CoffeeFlavorFactory factory; // 创建几个不同的订单,但某些口味会被共享 std::vector"Espresso", "Latte", "Espresso", "Cappuccino", "Espresso"}; for (const auto& order : orders) { auto flavor = factory.getOrder(order); flavor-serve(); } return 0;}public: virtual ~CoffeeFlavor() {} virtual void serve(const std::string& extras, const std::string& size) const = 0;};// 具体享元类class ConcreteCoffeeFlavor : public CoffeeFlavor {public: explicit ConcreteCoffeeFlavor(const std::string& flavorName) : flavorName_(flavorName) {} void serve(const std::string& extras, const std::string& size) const override { std::cout private: std::map if (flavors.find(flavor) == flavors.end()) { flavors[flavor] = std::make_sharedpublic: CoffeeOrder(std::shared_ptr} void serve() const { flavor_-serve(extras_, size_); }private: std::shared_ptr CoffeeFlavorFactory factory; // 创建几个不同的订单,但某些口味会被共享 std::vector {factory.getOrder("Espresso"), "no sugar", "small"}, {factory.getOrder("Latte"), "extra foam", "medium"}, {factory.getOrder("Espresso"), "double sugar", "large"}, {factory.getOrder("Cappuccino"), "cinnamon", "medium"}, {factory.getOrder("Espresso"), "single sugar", "small"} }; for (const auto& order : orders) { order.serve(); } return 0;} - 抽象享元(Flyweight Interface):
上一篇:怎么加入柯南朋友的服务器
下一篇:暗黑3怎么更换服务器?
最新文章
- 怎么删excel服务器?
- 极域课堂管理系统,教育数字化转型的领航者,高效课堂管理必备工具!
- 网站怎么创建流程?
- 鑫威服务器怎么样?
- npm报错:request to https://registry.npm.taobao.org failed, reason certificate has expired
- 发邮箱服务器异常怎么解决?
- 揭秘PHP防伪系统核心源码,筑牢网络安全防线!
- 创意自制盆栽盆教程,打造独特植物小天地
- 英语脸怎么读啊?
- vue-element-admin - 超详细克隆并运行项目教程,完美解决 git clone 克隆项目失败、npm install 装包报错失败、项目运行后打开是英文的汉化等问题(新手小白一看就懂)