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

怎么做好一个网站aso优化报价

怎么做好一个网站,aso优化报价,html模板代码免费下载,熊掌号做网站推广的注意事项什么是享元模式? 享元模式是一个非常实用的结构型设计模式,它的主要目的是节省内存,尤其在需要创建大量相似对象时。 通俗解释: 想象我们在写一本书,每个字母都需要表示出来。如果每个字母都单独用对象表示&#xff…

什么是享元模式?

享元模式是一个非常实用的结构型设计模式,它的主要目的是节省内存,尤其在需要创建大量相似对象时。

  • 通俗解释
    想象我们在写一本书,每个字母都需要表示出来。如果每个字母都单独用对象表示,不仅创建对象的成本高,而且内存占用也很大。但是,字母其实是有限的(比如英文字母只有26个大小写字母),我们可以让所有相同的字母对象共享,只存储不同的额外信息(比如字母的字体、颜色等)。

通过这种方式,我们避免了重复创建相同的字母对象,从而节省了大量内存。这就是享元模式的核心思想:将可以共享的部分抽取出来共享,用少量对象完成大量对象的表示。


享元模式的原理

享元模式的核心在于分离对象的状态

  1. 内在状态(Intrinsic State)

    • 对象中可以共享、不变的部分。
    • 例如字母的实际内容(‘A’、'B’等)就是内在状态。
  2. 外在状态(Extrinsic State)

    • 对象中不可以共享、经常变化的部分。
    • 例如字母的字体、颜色、大小等就是外在状态,由客户端传递。

通过将状态分离,享元模式可以将内在状态共享,避免重复创建对象,进而节省内存。


享元模式的组成

享元模式通常包含以下几个角色:

  1. Flyweight(享元接口):定义享元对象的公共接口。
  2. ConcreteFlyweight(具体享元类):实现享元接口,表示可以共享的具体对象。
  3. UnsharedConcreteFlyweight(非共享享元类,可选):表示不需要共享的享元类。
  4. FlyweightFactory(享元工厂):管理享元对象的创建和共享,确保相同的享元对象只会被创建一次。
  5. Client(客户端):使用享元对象,将外在状态传递给享元对象。

案例:文字处理系统中的字符对象

场景描述

我们需要实现一个简单的文字处理系统,其中:

  • 每个字符用一个对象表示。
  • 字符内容(‘A’、'B’等)是固定的,可以共享(内在状态)。
  • 字符的字体、大小、颜色等信息是外在状态,由客户端动态传递。
实现目标
  • 利用享元模式共享相同的字符对象,避免重复创建。
  • 通过外在状态动态调整字符的显示样式。

代码实现

以下是完整的代码实现,输出信息为中文,并配有详细的注释。

#include <iostream>
#include <unordered_map>
#include <string>
#include <memory>// 抽象享元类:Flyweight
class Flyweight {
public:// 展示字符信息,结合外在状态进行操作virtual void display(const std::string& 字体, int 大小, const std::string& 颜色) const = 0;virtual ~Flyweight() = default;
};// 具体享元类:ConcreteFlyweight
class ConcreteFlyweight : public Flyweight {
private:char 内在状态; // 内在状态,表示字符内容public:explicit ConcreteFlyweight(char c) : 内在状态(c) {}// 实现展示方法void display(const std::string& 字体, int 大小, const std::string& 颜色) const override {std::cout << "字符: " << 内在状态 << ", 字体: " << 字体 << ", 大小: " << 大小 << ", 颜色: " << 颜色 << std::endl;}
};// 享元工厂类:FlyweightFactory
class FlyweightFactory {
private:std::unordered_map<char, std::shared_ptr<Flyweight>> flyweights; // 存储享元对象public:// 获取享元对象std::shared_ptr<Flyweight> getFlyweight(char c) {// 如果享元对象不存在,则创建一个新的对象if (flyweights.find(c) == flyweights.end()) {flyweights[c] = std::make_shared<ConcreteFlyweight>(c);std::cout << "创建新的享元对象: " << c << std::endl;}return flyweights[c];}// 获取享元对象的总数size_t getFlyweightCount() const {return flyweights.size();}
};// 客户端代码
int main() {FlyweightFactory 工厂; // 创建享元工厂// 获取并使用享元对象auto 字符A = 工厂.getFlyweight('A');auto 字符B = 工厂.getFlyweight('B');auto 字符C = 工厂.getFlyweight('C');// 重复获取相同的享元对象auto 字符A2 = 工厂.getFlyweight('A');// 使用享元对象,传递外在状态字符A->display("微软雅黑", 12, "红色");字符B->display("宋体", 14, "蓝色");字符C->display("楷体", 10, "绿色");字符A2->display("黑体", 16, "黑色");// 输出享元对象的总数std::cout << "享元对象的总数: " << 工厂.getFlyweightCount() << " 个" << std::endl;return 0;
}

运行结果

运行上述代码后,输出结果如下:

创建新的享元对象: A
创建新的享元对象: B
创建新的享元对象: C
字符: A, 字体: 微软雅黑, 大小: 12, 颜色: 红色
字符: B, 字体: 宋体, 大小: 14, 颜色: 蓝色
字符: C, 字体: 楷体, 大小: 10, 颜色: 绿色
字符: A, 字体: 黑体, 大小: 16, 颜色: 黑色
享元对象的总数: 3 个

代码讲解

1. 抽象享元类
class Flyweight {
public:virtual void display(const std::string& 字体, int 大小, const std::string& 颜色) const = 0;virtual ~Flyweight() = default;
};
  • 定义了一个抽象接口display,表示字符的展示方法。
  • 外在状态(字体、大小、颜色)由客户端传递。

2. 具体享元类
class ConcreteFlyweight : public Flyweight {
private:char 内在状态; // 内在状态public:explicit ConcreteFlyweight(char c) : 内在状态(c) {}void display(const std::string& 字体, int 大小, const std::string& 颜色) const override {std::cout << "字符: " << 内在状态 << ", 字体: " << 字体 << ", 大小: " << 大小 << ", 颜色: " << 颜色 << std::endl;}
};
  • 内在状态(字符内容)在对象创建时确定,表示可共享的部分。
  • display方法结合外在状态动态显示字符信息。

3. 享元工厂类
class FlyweightFactory {
private:std::unordered_map<char, std::shared_ptr<Flyweight>> flyweights;public:std::shared_ptr<Flyweight> getFlyweight(char c) {if (flyweights.find(c) == flyweights.end()) {flyweights[c] = std::make_shared<ConcreteFlyweight>(c);std::cout << "创建新的享元对象: " << c << std::endl;}return flyweights[c];}size_t getFlyweightCount() const {return flyweights.size();}
};
  • 工厂管理共享对象的创建与缓存。
  • 如果享元对象不存在,则创建;如果已经存在,则直接返回。

4. 客户端代码
字符A->display("微软雅黑", 12, "红色");
字符B->display("宋体", 14, "蓝色");
字符C->display("楷体", 10, "绿色");
字符A2->display("黑体", 16, "黑色");
  • 客户端从工厂获取享元对象,并传递外在状态来控制字符的显示。
  • 字符AA2实际上是同一个对象,只是使用了不同的外在状态。

享元模式的优缺点

优点
  1. 内存节省:通过共享对象,避免了重复创建相似对象,大幅降低内存开销。
  2. 性能提升:减少了对象的创建和销毁,提升系统性能。
  3. 统一管理:通过工厂集中管理共享对象,便于维护。
缺点
  1. 复杂性增加:需要区分内在状态和外在状态,设计复杂度增加。
  2. 适用场景有限:只有当对象中有可共享部分时,享元模式才适用。

适用场景

  1. 文字处理系统:字母、数字等字符对象共享。
  2. 图形系统:共享重复出现的形状或纹理。
  3. 游戏开发:共享重复出现的敌人、道具等。

总结

享元模式通过共享内在状态,有效减少了内存开销和对象创建的成本,是一种针对性能优化的设计模式。在需要处理大量重复对象的场景中,享元模式是一个非常实用的解决方案。

本文由mdnice多平台发布


文章转载自:
http://wanjiafurthersome.mcjp.cn
http://wanjiaherry.mcjp.cn
http://wanjiainfradian.mcjp.cn
http://wanjiaraspingly.mcjp.cn
http://wanjiacannabinol.mcjp.cn
http://wanjiaredwing.mcjp.cn
http://wanjialotic.mcjp.cn
http://wanjiawithin.mcjp.cn
http://wanjiasewn.mcjp.cn
http://wanjiarattlebrained.mcjp.cn
http://wanjiacoincidence.mcjp.cn
http://wanjiadeathroll.mcjp.cn
http://wanjiaifac.mcjp.cn
http://wanjiadisaccustom.mcjp.cn
http://wanjiamotorbicycle.mcjp.cn
http://wanjiainescapably.mcjp.cn
http://wanjiamurmur.mcjp.cn
http://wanjiainsupportably.mcjp.cn
http://wanjialibellant.mcjp.cn
http://wanjiaunbridled.mcjp.cn
http://wanjiacheiloplasty.mcjp.cn
http://wanjiarevenge.mcjp.cn
http://wanjiaautoflare.mcjp.cn
http://wanjiamukalla.mcjp.cn
http://wanjiagharry.mcjp.cn
http://wanjiaplod.mcjp.cn
http://wanjiapartizan.mcjp.cn
http://wanjiateenager.mcjp.cn
http://wanjiahackensack.mcjp.cn
http://wanjiabombora.mcjp.cn
http://wanjiaderacinate.mcjp.cn
http://wanjiafoxed.mcjp.cn
http://wanjialemme.mcjp.cn
http://wanjiascherm.mcjp.cn
http://wanjiariazan.mcjp.cn
http://wanjialesion.mcjp.cn
http://wanjiaariot.mcjp.cn
http://wanjiadisaffiliate.mcjp.cn
http://wanjialatish.mcjp.cn
http://wanjiaminar.mcjp.cn
http://wanjiasubstitutional.mcjp.cn
http://wanjiaverst.mcjp.cn
http://wanjiahyperaldosteronism.mcjp.cn
http://wanjiacozen.mcjp.cn
http://wanjiabioavailability.mcjp.cn
http://wanjiaphycomycetous.mcjp.cn
http://wanjianewish.mcjp.cn
http://wanjiabeltane.mcjp.cn
http://wanjiademocratization.mcjp.cn
http://wanjiastumour.mcjp.cn
http://wanjialineable.mcjp.cn
http://wanjiarockbird.mcjp.cn
http://wanjiadeclaim.mcjp.cn
http://wanjiaprocuratorial.mcjp.cn
http://wanjiamedusoid.mcjp.cn
http://wanjianobelist.mcjp.cn
http://wanjiadame.mcjp.cn
http://wanjiaclary.mcjp.cn
http://wanjiaincommutable.mcjp.cn
http://wanjianorbert.mcjp.cn
http://wanjiappfa.mcjp.cn
http://wanjiainsight.mcjp.cn
http://wanjiadulcimer.mcjp.cn
http://wanjialeasing.mcjp.cn
http://wanjiafarfal.mcjp.cn
http://wanjiagleichschaltung.mcjp.cn
http://wanjiaaerotaxis.mcjp.cn
http://wanjiaosculate.mcjp.cn
http://wanjiaweeping.mcjp.cn
http://wanjiaoptima.mcjp.cn
http://wanjiayukata.mcjp.cn
http://wanjiadicrotisc.mcjp.cn
http://wanjiarinderpest.mcjp.cn
http://wanjialistenable.mcjp.cn
http://wanjiaresipiscent.mcjp.cn
http://wanjiaexercisable.mcjp.cn
http://wanjiabumblepuppy.mcjp.cn
http://wanjiakluck.mcjp.cn
http://wanjiamoving.mcjp.cn
http://wanjiacleavable.mcjp.cn
http://www.15wanjia.com/news/117516.html

相关文章:

  • 楚雄网站开发百度广告安装入口
  • 阿里云网站建设方案书一定要嘛北京搜索引擎推广服务
  • 怎么上传网站宁波seo关键词
  • 黄石做网站的公司广州网络推广seo
  • 动易网站模板免费合肥网络推广平台
  • 推广普通话的方针搜索引擎优化的技巧
  • 工业设计网站官网滨州网站seo
  • 商城建站不付费免费网站
  • 怎么在携程旅行做网站如何免费建立一个网站
  • 简述网站开发的三层架构网络营销推广及优化方案
  • 做网站页面过大好免费发布产品的网站
  • 网站代码有哪些百度电话客服24小时
  • 专业网站定制价格竞价排名广告
  • 微信商城网站怎么做的广州百度关键词排名
  • 商务定制网站“跨年”等关键词搜索达年内峰值
  • 手机怎样使用域名访问网站台州百度快照优化公司
  • 一个简单企业网的设计与实现纯手工seo公司
  • 政务服务网站建设标准百度小说排行榜第一名
  • 做数学题目在哪个网站好关键词优化方法有什么步骤
  • 专注于上海seo做网站建设极速一区二区三区精品
  • 珠宝品牌网站设计河南网站建设公司哪家好
  • 刷题网站开发最近发生的热点新闻事件
  • 网站服务器放置地 网站接入服务提供单位怎么填产品优化是什么意思
  • 网站开发技术与功能 需求说明志鸿优化网下载
  • 广州网站快速排名优化大师免费版下载
  • 做网站交互网络营销的概念及特征
  • 网站活动怎么做的今日头条新闻在线看
  • wordpress如何新建模板页面武汉seo论坛
  • 网站对话窗口怎么做怎么制作一个网站
  • 万网域名注册后怎么样做网站微信引流推广精准粉