享元模式

享元模式

概念

Flyweight模式也叫享元模式,是构造型模式之一,它通过与其他类似对象共享数据来减小内存占用。说白了,就是共享内存,共享对象!

角色和职责

这里写图片描述

  • 抽象享元角色:
    所有具体享元类的父类,规定一些需要实现的公共接口。

  • 具体享元角色:
    抽象享元角色的具体实现类,并实现了抽象享元角色规定的方法。

  • 享元工厂角色:
    负责创建和管理享元角色。

使用场景:
是以共享的方式,高效的支持大量的细粒度的对象。

案例

#include <iostream>
#include <map>
using namespace std;


/*享元--共享元素
用共享的方式,高效的支持大量细粒度的的对象
*/

class Person
{
public:
    Person(string name,int age)
    {
        m_name = name;
        m_age = age;
    }
    virtual void printTeacher() = 0;
protected:
    string m_name;
    int m_age;
};


class Teacher : public Person
{
public:
    Teacher(string name,int age,string id):Person(name,age)
    {
        m_id = id;
    }

    virtual void printTeacher()
    {
        cout<<"name : "<<m_name<<"\tage :"<<m_age<<"\tid: "<<m_id<<endl;
    }

private:
    string m_id;
};


/*完成老师节点的存储*/
class FlyWeightFactory
{
public:
    FlyWeightFactory()
    {
        map1.clear();
    }

    ~FlyWeightFactory()
    {
       while(!map1.empty())
       {
           Person*tmp =NULL;
           map<string,Person *>::iterator it = map1.begin();

           tmp = it->second;
           map1.erase(it);

           delete tmp;
       }
    }

    Person * GetTeacher(string id)
    {
        map<string,Person *>::iterator it ;
        it = map1.find(id);

        if(it == map1.end())
        {
            string name;
            int age;
            cout <<"input name:"<<endl;
            cin >>name;

            cout <<"input age:"<<endl;
            cin >>age;

            Person* tmp = new Teacher(name,age,id);

            map1.insert(pair<string,Person*>(id,tmp));

            return tmp;
        }else{
            return it->second;
        }


    }

private:
    map<string,Person *> map1;
};


int main2610()
{
    FlyWeightFactory * fwt = new FlyWeightFactory;

    Person *p1 = NULL;
    p1 = fwt->GetTeacher("001");
    p1->printTeacher();

    Person *p2 = NULL;
    p2 = fwt->GetTeacher("001");
    p2->printTeacher();

    delete fwt;

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值