我与C++设计模式(九)——享元模式

本文介绍了享元模式的基本概念及其在面向对象设计中的应用。通过一个示例,详细解释了如何利用享元模式来减少对象创建的数量,从而节省内存资源。文章还提供了具体的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

享元模式,Flyweight,在面向对象设计中,创建对象是极为正常的事情了,然而,当我们到处创建对象还是在创建同一种类型的对象或者同一种抽象类型的对象时,显得好低效,浪费内存。比如,当一篇文章,每个字符都是一个对象,字母a肯定出现了很多遍,如果每次都要建立一个对象,工作量就很大了,试想,如果我们共享同一个对象“a”,只是在不同的地方显示不同的字体、颜色等,设计时将对象a分为内部和外部两种状态,对于共享的部分设为内置,不共享的部分设为外置,那么事情会变得很省劲儿。这个方法就是享元的思想。

UML图:


从上图能看到有一个工厂FlyweightFactory在里面,当client需要一个对象,比方说a,就可以想FlyweightFactory发送一个请求GetFlyweight(),Flyweight拥有一个管理、存储对象的仓库,或者成为对象池,可以用vector或hash表实现,GetFlyweight会遍历对象池中的对象,如果已经存在a就直接返回给client,否则,创建一个对象返回给client,最右边部分是不想被共享的对象,本模式暂不讲解。Flyweight是享元类接口,内置部分的信息包含在这个类里面,concreteFlyweight是具体实现部分,外置部分在其中。

代码:

#ifndef _FLYWEIGHT_H__
#define _FLYWEIGHT_H__

#include <vector>
#include <string>
using namespace std;

class flyweight
{
        public:
                virtual ~flyweight();
                virtual void operation(const string&);
                string get_intrinsic_state();

        protected:
                flyweight(string);

        private:
                string _in_str;
};

class concrete_flyweight:public flyweight
{
        public:
                concrete_flyweight(string);
                ~concrete_flyweight();

                void operation(const string&);
};

class flyweight_factory
{
        public:
                flyweight_factory();
                ~flyweight_factory();

                flyweight *get_flyweight(const string&);

        private:
                vector<flyweight*> _fly;
};
#endif

//flyweight.cpp

#include "flyweight.h"
#include <iostream>
#include <vector>
#include <string>
#include <cassert>
using namespace std;

flyweight::flyweight(string intrinsic_state)
{
        _in_str = intrinsic_state;
}

flyweight::~flyweight()
{
}

void flyweight::operation(const string &extrinsic_state)
{
}

string flyweight::get_intrinsic_state()
{
        return _in_str;
}


concrete_flyweight::concrete_flyweight(string intrinsic_state)
        :flyweight(intrinsic_state)
{
        cout<<"concrete flyweight created"<<endl;
}

concrete_flyweight::~concrete_flyweight()
{
}

void concrete_flyweight::operation(const string &extrinsic_state)
{
        cout<<"concrete flyweight intrinsic_state :"<<get_intrinsic_state();
        cout<<"extrinsic_state :"<<extrinsic_state<<endl;
}


flyweight_factory::flyweight_factory()
{
}

flyweight_factory::~flyweight_factory()
{
        //destructor work defualted
}

flyweight *flyweight_factory::get_flyweight(const string &key)
{
        vector<flyweight*>::iterator ite = _fly.begin();

        for ( ; ite != _fly.end(); ++ite)
        {
                if (key == (*ite)->get_intrinsic_state() )
                {
                        cout<<"already created..."<<endl;
                        return *ite;
                }
        }

        flyweight *temp = new concrete_flyweight(key);
        _fly.push_back(temp);

        return temp;
}

//main.cpp

#include "flyweight.h"

#include <iostream>
using namespace std;

int main(int argc, char **argv)
{
        flyweight_factory * p_fac = new flyweight_factory();

        flyweight *p_fly1 = p_fac->get_flyweight("jack");
        flyweight *p_fly2 = p_fac->get_flyweight("rose");
        flyweight *p_fly3 = p_fac->get_flyweight("jack");

        return 0;
}

 g++ -o flyweight main.cpp flyweight.cpp

千万要分清gcc还是g++,不然,除bug你会很头疼。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值