虚位以待(AD)
虚位以待(AD)
首页 > 软件编程 > C/C++编程 > C++设计模式之享元模式(Flyweight)

C++设计模式之享元模式(Flyweight)
类别:C/C++编程   作者:码皇   来源:互联网   点击:

这篇文章主要为大家详细介绍了C++设计模式之享元模式Flyweight,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

享元模式顾名思义就是羽量级模式或者蝇级模式,形容体量小的应用,该模式主要的设计目的是为了迎合系统大量相似数据的应用而生,减少用于创建和操作相似的细碎对象所花费的成本。大量的对象会消耗高内存,享元模式给出了一个解决方案,即通过共享对象来减少内存负载。

作用

通过复用相同的对象来减少对象的创建数量,创建更小的对象组,并通过共享实现重用。通过归类,将对象的属性分为内蕴状态和外蕴状态。要创建具体的享元对象,我们需要创建一个享元工厂来统一管理对象的生成和输出,享元工厂是实现享元模式的关键。

举个例子,享元模式可以看成是一个工具箱,而享元对象就是工具箱内的具体的工具,我们在使用工具的时候,不必每回临时的制造工具,而是直接从工具箱里找到工具进行使用,这样就大大节约了制造工具的成本时间和工具占用的空间。

享元模式比较迷惑在于理解两种状态的分类,内蕴状态是对象本身的属性,在生成对象以后一般不会进行改变,比如工具中的属性:名字、大小、重量等,还有就是我们一般需要一个关键性的属性作为其区别于其他对象的key,如工具的话我们可以把名称作为找到工具的唯一标识。

外蕴状态是对象的外部描述,是每个对象的可变部分,比如对工具的使用地点、使用时间、使用人、工作内容的描述,这些属性不属于对象本身,而是根据每回使用情况进行变化的,这就需要制作成接口进行外部调用,而外蕴状态的维护是由调用者维护的,对象内不进行维护。

类视图

实现

    //Flyweightclass tool{
    public: //内蕴状态 string name;
    int nSize;
    int nWeight;
    public: //外蕴状态 virtual int used(string person, string work)=0;
    }
    //ConcreteFlyweightclass hammer : public tool{
    public: hammer():name("hammer"){
    }
    int used(string person, string work) {
    cout<< person <<"use"<<name<<"to" << work;
    }
    }
    //ConcreteFlyweightclass screwdriver : public tool{
    screwdriver():name("screwdriver"){
    }
    int used(string person, string work) {
    cout<< person <<"use"<< name << " to" << work;
    }
    }
    //ConcreteFlyweightclass saw : public tool{
    saw():name("saw"){
    }
    int used(string person, string work) {
    cout<< person <<"use"<< name <<"to" << work;
    }
    }
    //FlyweightFactoryclass toolbox{
    public: toolbox();
    virtual ~toolbox() {
    map<string,tool*>::iterator it = m_tool.find(toolname);
    for(it=m_tool.begin();
    it!=m_tool.end();
    it++) {
    delete it.second;
    }
    }
    tool* GetTool(string toolname) {
    map<string,tool*>::iterator it = m_tool.find(toolname);
    if(it != m_tool.end()) {
    return (tool*) it.second;
    }
    else {
    tool* tooltemp= NULL;
    if(toolname == "hammer") tooltemp = new hammer();
    else if(toolname == "screwdriver") tooltemp = new screwdriver();
    else if(toolname == "saw") tooltemp = new saw();
    if(tooltemp !=NULL) m_tool.insert(make_pair<string,tool*>(toolname,tooltemp));
    return tooltemp;
    }
    }
    private: map<string,tool*> m_tool;
    }
    int main(){
    //外蕴状态 由调用者维护 string person1 = "zhangsan";
    string person2 = "lisi";
    string work1 = "make desk";
    string work2 = "repair bike";
    //生成工厂 toolbox tBox;
    //获取享元 tool* tool1 = tBox.GetTool("hammer");
    tool1.used(person1,work1);
    tool* tool2 = tBox.GetTool("screwdriver");
    tool2.used(person2,work2);
    }

单享元(share)和复合享元(unshare)
复合享元也既是unshareFlyweight,其不再是单一的对象,而是一系列对象的组合,他们的关系由原来的一对一的关系,变成了一对多的关系。
举例说明,如【DP】中比较经典的围棋的例子,单享元模式下,我们对围棋的颜色种类进行共享,再棋盘的工厂类中只需包含黑白两颗棋子,就能完成对棋盘下棋的整个操作,而不用对每一个棋子进行操作。但是有一天需求增加了对胜负的要求,那么就需要对棋子的坐标进行记录,对于黑白两种颜色的棋子,相对应的就会有相同颜色棋子的坐标数组容器,like:map<string,vector<Point>> 这样的结构。

应用场景

  • 需要创建大量对象时;
  • 大多数对象可以分为内蕴和外蕴状态;
  • 应用程序需要使用多种对象,并且重复使用;

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

您可能感兴趣的文章:

  • 设计模式中的备忘录模式解析及相关C++实例应用
  • C++设计模式之备忘录模式
  • C++设计模式之桥接模式(Bridge)
  • C++设计模式之组合模式(Composite)
  • C++设计模式之策略模式(Strategy)
  • C++设计模式之模板方法模式(TemplateMethod)
  • C++设计模式之观察者模式(Observer)
  • C++设计模式之迭代器模式(Iterator)
  • C++设计模式之适配器模式(Adapter)
  • C++设计模式之备忘录模式(Memento)
相关热词搜索: C++ 设计模式 享元模式