设计模式之享元模式-来点高效省内存的!

一、享元模式的概念

享元模式属于结构型模式,主要用于减少创建对象的数量,以减少内存占用和提高性能。

享元模式尝试复用现有的对象实例,如果有就复用,没有再创建,从而达到减少内存占用和提高性能的目的。

二、享元模式使用场景

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、提高了系统的复杂度,需要剥离出系统的外部状态和内部状态,而且外部状态具有固有化的性质,不应该随着内部状态的变化而变化,否则会造成系统的混乱。

能力有限,如有错误,多多指教。。。

发布了157 篇原创文章 · 获赞 135 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/toby54king/article/details/104463861