一、说明
享元模式:运用共享技术有效地支持大量细粒度的对象。在有大量对象时,把其中共同的部分抽象出来,如果有相同的业务请求,直接返回内存中已有的对象,避免重新创建。
以下情况可以考虑使用享元模式:
系统中有大量的对象,这些对象消耗大量的内存,且这些对象的状态可以被外部化。
对于享元模式,需要将对象的信息分为两个部分:内部状态和外部状态。内部状态是指被共享出来的信息,储存在享元对象内部且不随环境变化而改变;外部状态是不可以共享的,它随环境改变而改变,是由客户端控制的。
二、代码
#ifndef SHARE_H
#define SHARE_H
#include <QString>
#include <QMap>
#include <QDebug>
class abstractConsumer{
public:
virtual ~abstractConsumer(){}
virtual void setArticle(const QString& article)=0;
virtual const QString& article()=0;
};
class consumer:public abstractConsumer{
public:
consumer(const QString& name):m_name(name){}
~consumer() override;
void setArticle(const QString &article) override{
m_article = article;
}
const QString & article() override{
return m_article;
}
private:
QString m_name;
QString m_article;
};
class factory{
public:
factory(){}
~factory(){
QMap<QString,consumer*>::iterator iter;
for(iter = m_consumerMap.begin();iter!=m_consumerMap.end();iter++){
delete iter.value();
}
m_consumerMap.clear();
}
void hosting(const QString& user,const QString& article){
consumer *pConsumer;
if(m_consumerMap.contains(user)){
pConsumer = m_consumerMap.value(user);
}else{
pConsumer = new consumer(user);
m_consumerMap.insert(user,pConsumer);
}
pConsumer->setArticle(article);
}
void display(){
QMap<QString,consumer*>::iterator iter;
for(iter = m_consumerMap.begin();iter!=m_consumerMap.end();iter++){
qDebug()<<iter.key()<<iter.value()<<iter.value()->article();
}
}
private:
QMap<QString,consumer*> m_consumerMap;
};
#endif // SHARE_H