一、享元模式的概念
享元模式属于结构型模式,主要用于减少创建对象的数量,以减少内存占用和提高性能。
享元模式尝试复用现有的对象实例,如果有就复用,没有再创建,从而达到减少内存占用和提高性能的目的。
二、享元模式使用场景
1、需要以共享的方式,高效的支持大量的细粒度的对象时可以使用享元模式。
2、需要使用缓冲池技术时可以使用享元模式。
三、享元模式构建方法
1、抽象享元类
所有具体享元的父类,给具体享元提供统一的公共接口。
2、具体享元类
抽象享元的具体实现类,实现抽象享元的规定的方法和行为。
3、享元工厂类
负责创建和管理所有的享元对象。
四、享元模式的示例
// FlyweightPattern.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include <string>
#include <map>
#define DELETE_PTR(p) {if(p!=nullptr){delete (p); (p)=nullptr;}}
using namespace std;
// 享元抽象类
class Person
{
public:
Person(string name, int age, string sex)
{
m_name = name;
m_age = age;
m_sex = sex;
}
string getName()
{
return m_name;
}
int getAge()
{
return m_age;
}
string getSex()
{
return m_sex;
}
protected:
string m_name;
int m_age;
string m_sex;
};
// 享元具体类
class Employee : public Person
{
public:
Employee(int id, string name, int age, string sex):Person(name,age,sex)
{
m_id = id;
}
int getId()
{
return m_id;
}
void printInfo()
{
cout << "id: " << m_id << "\t" << "name: " << m_name << "\t" << "age: " << m_age << "\t" << "sex: " << m_sex << "\t" << endl;
cout << "---------------------------------------------------------------------------------" << endl;
}
private:
int m_id;
};
// 享元工厂类
class EmployeeFactory
{
public:
EmployeeFactory()
{
}
~EmployeeFactory()
{
while (!m_employeeMap.empty())
{
Employee *pEmployee = nullptr;
map<int, Employee*>::iterator iter = m_employeeMap.begin();
pEmployee = iter->second;
m_employeeMap.erase(iter);
DELETE_PTR(pEmployee);
}
m_employeeMap.clear();
}
Employee *getEmployee(int id)
{
string name = "";
int age = 0;
string sex = "男";
Employee *pEmployee = nullptr;
map<int, Employee*>::iterator iter = m_employeeMap.find(id);
if (iter == m_employeeMap.end())
{
cout << "id为:" << id << "员工不存在,系统为你创建该员工,请输入信息。" << endl;
cout << "员工名字:";
cin >> name;
cout << "员工年龄:";
cin >> age;
cout << "员工性别:";
cin >> sex;
pEmployee = new Employee(id, name, age, sex);
m_employeeMap.insert(pair<int,Employee*>(id,pEmployee));
}
else
{
cout << "id为:" << id << "员工存在,信息如下。" << endl;
pEmployee = (iter->second);
}
return pEmployee;
}
private:
map<int, Employee*> m_employeeMap;
};
int main()
{
cout << "-------------------享元模式-------------------" << endl;
EmployeeFactory *pEmployeeFactory = new EmployeeFactory;
Employee *pEmployee1 = pEmployeeFactory->getEmployee(1);
pEmployee1->printInfo();
Employee *pEmployee2 = pEmployeeFactory->getEmployee(2);
pEmployee2->printInfo();
Employee *pEmployee = pEmployeeFactory->getEmployee(1);
pEmployee->printInfo();
DELETE_PTR(pEmployeeFactory);
std::cout << "Hello World!\n";
getchar();
}
运行结果:
五、享元模式的优缺点
优点:
1、可以大大减少对象的创建,降低系统的内存占用,从而提高效率和系统性能。
缺点:
1、提高了系统的复杂度,需要剥离出系统的外部状态和内部状态,而且外部状态具有固有化的性质,不应该随着内部状态的变化而变化,否则会造成系统的混乱。
能力有限,如有错误,多多指教。。。