【设计模式26】享元模式

基本概念

在这里插入图片描述

具体案例

不考虑外部状态

在这里插入图片描述

#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include <crtdbg.h>   
#include<unordered_map>
#include<map>

using namespace std;

// 网站抽象类
class WebSite
{
public:
	WebSite();
	~WebSite();
	virtual void Use() = 0;

private:

};

//网站具体类
class ConcreteWebSite :public WebSite
{
public:
	ConcreteWebSite();
	~ConcreteWebSite();
	ConcreteWebSite(string name) {
		this->name = name;
	}
	void Use() {
		cout << "网站分类:" << name << endl;
	}

private:
	string name;

};

//网站工厂
class WebSiteFactory
{
public:
	WebSiteFactory();
	~WebSiteFactory();
	WebSite* GetWebSiiteCategory(string key) {
		if (flyweights.find(key) == flyweights.end()) {
			flyweights.emplace(key, new ConcreteWebSite(key));
		}
		return flyweights[key];
	}
	int GetWebSiteCount() {
		return flyweights.size();
	}

private:
	map<string, ConcreteWebSite*> flyweights;
};

WebSiteFactory::WebSiteFactory()
{
}

WebSiteFactory::~WebSiteFactory()
{
}


ConcreteWebSite::ConcreteWebSite()
{
}

ConcreteWebSite::~ConcreteWebSite()
{
}

WebSite::WebSite()
{
}

WebSite::~WebSite()
{
}

int main(int argc, char** argv)
{
	WebSiteFactory* f = new WebSiteFactory();
	WebSite* fx = f->GetWebSiiteCategory("商品上架");
	fx->Use();

	WebSite* fy = f->GetWebSiiteCategory("商品上架");
	fy->Use();

	WebSite* fz = f->GetWebSiiteCategory("商品上架");
	fz->Use();

	WebSite* fm = f->GetWebSiiteCategory("博客");
	fm->Use();

	WebSite* fn = f->GetWebSiiteCategory("博客");
	fn->Use();

	WebSite* fq = f->GetWebSiiteCategory("博客");
	fq->Use();

	cout << "网站总数:" << f->GetWebSiteCount() << endl;

	delete f, fx, fy, fz, fn, fm, fq;
	return 0;
}

考虑内外部状态

在这里插入图片描述

#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include <crtdbg.h>   
#include<unordered_map>
#include<map>

using namespace std;


//用户
class User
{
public:
	User();
	~User();
	User(string name) {
		this->name = name;
	}

	string getName() {
		return name;
	}

private:
	string name;
};

// 网站抽象类
class WebSite
{
public:
	WebSite();
	~WebSite();
	virtual void Use(User user) = 0;

private:

};

//网站具体类
class ConcreteWebSite :public WebSite
{
public:
	ConcreteWebSite();
	~ConcreteWebSite();
	ConcreteWebSite(string name) {
		this->name = name;
	}
	void Use(User user) {
		cout << "网站分类:" << name << " 用户:" << user.getName() << endl;
	}

private:
	string name;

};

//网站工厂
class WebSiteFactory
{
public:
	WebSiteFactory();
	~WebSiteFactory();
	WebSite* GetWebSiiteCategory(string key) {
		if (flyweights.find(key) == flyweights.end()) {
			flyweights.emplace(key, new ConcreteWebSite(key));
		}
		return flyweights[key];
	}
	int GetWebSiteCount() {
		return flyweights.size();
	}

private:
	map<string, ConcreteWebSite*> flyweights;
};

User::User()
{
}

User::~User()
{
}

WebSiteFactory::WebSiteFactory()
{
}

WebSiteFactory::~WebSiteFactory()
{
}


ConcreteWebSite::ConcreteWebSite()
{
}

ConcreteWebSite::~ConcreteWebSite()
{
}

WebSite::WebSite()
{
}

WebSite::~WebSite()
{
}

int main(int argc, char** argv)
{
	WebSiteFactory* f = new WebSiteFactory();
	WebSite* fx = f->GetWebSiiteCategory("商品上架");
	fx->Use(User("菜鸡"));

	WebSite* fy = f->GetWebSiiteCategory("商品上架");
	fy->Use(User("张三"));

	WebSite* fz = f->GetWebSiiteCategory("商品上架");
	fz->Use(User("李牛"));

	WebSite* fm = f->GetWebSiiteCategory("博客");
	fm->Use(User("牛萌萌"));

	WebSite* fn = f->GetWebSiiteCategory("博客");
	fn->Use(User("李三多"));

	WebSite* fq = f->GetWebSiiteCategory("博客");
	fq->Use(User("王小二"));

	cout << "网站总数:" << f->GetWebSiteCount() << endl;

	delete f, fx, fy, fz, fn, fm, fq;
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值