设计模式C++实现二十二:享元模式

享元模式(flyweight):运用共享技术有效地支持大量细粒度的对象。

享元模式可以避免大量非常相似类的开销。在程序设计中,有时需要生成大量细粒度的类实例来表示数据。如果能发现这些实例除了几个参数外基本上都是相同的,有时就能够受大幅度地减少需要实例化的类的数量。如果能把那些参数移到类实例的外面,在方法调用时将它们传过来,就可以通过共享大幅度地减少单个实例的数目。

使用场景:如果一个应用程序使用了大量的对象,而大量的这些对象造成了很大的存储开销时就应该考虑应用,还有就是对象的大多数状态可以外部状态,如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象,此时可以考虑使用享元模式。

#ifndef FRYWEIGHT_H
#define FRYWEIGHT_H
#include <iostream>
#include <string>
#include <hash_set>
using namespace std;
class User
{
	friend class ConcreteWebSite;
	string name;
public:
	User(string n) :name(n){}
};

class ConcreteWebSite
{
	string name = "";
public:
	ConcreteWebSite(string n){ name = n; }
	void Use(User user)
	{
		cout << "网站分类: " << name << " 用户: " << user.name << endl;
	}
};

class WebSiteFactory
{
	hash_set<string> flyweights;
public:
	ConcreteWebSite GetWebSiteCategory(string key)
	{
		if (flyweights.find(key) == flyweights.end())
			flyweights.insert(key);
		return ConcreteWebSite(key);
	}
	int GetWebSiteCount()
	{
		return flyweights.size();
	}

};

#endif
#include "Flyweight.h"

int main()
{
	WebSiteFactory Wfactory;
	ConcreteWebSite fx = Wfactory.GetWebSiteCategory("产品展示");
	fx.Use(User("小菜"));

	ConcreteWebSite fy = Wfactory.GetWebSiteCategory("产品展示");
	fy.Use(User("大鸟"));

	ConcreteWebSite fz = Wfactory.GetWebSiteCategory("产品展示");
	fz.Use(User("娇娇"));

	ConcreteWebSite fn = Wfactory.GetWebSiteCategory("博客");
	fn.Use(User("桃谷六仙"));

	ConcreteWebSite fm = Wfactory.GetWebSiteCategory("博客");
	fm.Use(User("南海鳄神"));

	cout << "得到的网站分类总数为: " << Wfactory.GetWebSiteCount();
	return 0;
}
时间: 2024-10-08 03:34:18

设计模式C++实现二十二:享元模式的相关文章

大话设计模式C++实现-第26章-享元模式

一.UML图 二.概念 享元模式(Flyweight):运用共享技术有效地支持大量细粒度的对象. flyweight的意思:轻量级. 三.说明 角色: (1)Flyweight类:它是所有具体享元类的超类或接口,通过这个接口,Flyweight可以接受并作用于外部状态. (2)ConcreteFlyweight类:继承Flyweight超类或实现Flyweight接口,并为内部状态增加存储空间. (3)UnsharedConcreteFlyweight:是指那些不需要共享的Flyweight子类

设计模式(十)享元模式Flyweight(结构型)

说明: 相对于其它模式,Flyweight模式在PHP实现似乎没有太大的意义,因为PHP的生命周期就在一个请求,请求执行完了,php占用的资源都被释放.我们只是为了学习而简单做了介绍. 1. 概述 面向对象技术可以很好地解决系统一些灵活性或可扩展性或抽象性的问题,但在很多情况下需要在系统中增加类和对象的个数.当对象数量太多时,将导致运行代价过高,带来性能下降等问题.比如:例子1:图形应用中的图元等对象.字处理应用中的字符对象等. 2.解决方案: 享元模式(Flyweight):对象结构型模式运用

设计模式(十)享元模式(Flyweight)-结构型

享元模式Flyweight 组合模式解决了对象时树形结构时的处理方式.当系统需要大量使用重复的对象,而这些对象要消耗很大的资源时就需要使用享元模式来解决. 单例模式,一个类只有一个唯一的对象.也就是说,不管new多少次,只需要创建这个类的一个对象,如果不采用单例模式,没new一次就会创建一个对象,这对于系统需要使用大量重复的对象,而这些对象需要消耗很大的资源时,是很不划算的,这时就需要使用享元模式. 数据库连接池就是享元模式的典型应用. 享元模式实现原理 享元模式的实现原理图 享元模式的优缺点

java/android 设计模式学习笔记(13)---享元模式

这篇我们来介绍一下享元模式(Flyweight Pattern),Flyweight 代表轻量级的意思,享元模式是对象池的一种实现.享元模式用来尽可能减少内存使用量,它适合用于可能存在大量重复对象的场景,缓存可共享的对象,来达到对象共享和避免创建过多对象的效果,这样一来就可以提升性能,避免内存移除和频繁 GC 等. 享元模式的一个经典使用案例是文本系统中图形显示所用的数据结构,一个文本系统能够显示的字符种类就是那么几十上百个,那么就定义这么些基础字符对象,存储每个字符的显示外形和其他的格式化数据

设计模式C#实现(十三)——享元模式(蝇量模式)

意图 0 适用性 1 结构 2 实现 3 效果 4 参考 5 意图 运用共享技术有效地支持大量细粒度的对象. 适用性 当以下情况都成立时使用: 一个程序使用了大量的对象 完全由于使用大量对象造成很大存储开销 对象的大多数状态都可以变为外部状态 如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象 应用程序不依赖对象标识 结构 以下摘自参考1 享元模式采用一个共享来避免大量拥有相同内容对象的开销.这种开销最常见.最直观的就是内存的损耗.享元对象能做到共享的关键是区分内蕴状态(Inte

《大话设计模式》学习笔记22:享元模式

网站共享代码示例: 1.Flyweight: public abstract class WebSite { public abstract void Use(); } 2.ConcreteeFlyweight: public class ConcreteWebSite:WebSite { private string webSiteCategory; public ConcreteWebSite(string webSiteCategory) { this.webSiteCategory =

《精通Python设计模式》学习结构型之享元模式

这个我日常当中也没有用到过, 真的是游戏行业用得多些? 学习一下, 有个印象. import random from enum import Enum TreeType = Enum('TreeTye', 'apple_tree cherry_tree peach_tree') class Tree: pool = dict() def __new__(cls, tree_type): obj = cls.pool.get(tree_type, None) if not obj: obj = o

二十一、享元设计模式

1. 享元设计模式介绍 享元模式用来尽可能减少内存使用量,它适合用于可能存在大量重复对象的场景,用来缓存可共享的对象,达到对象共享.避免创建过多对象的效果. 定义: 使用共享对象可有效地支持大量的细粒度对象. 2. 享元设计模式使用场景 如果一个系统中存在大量的相同或者相似的对象,由于这类对象的大量使用,会造成系统内存的消耗,可以使用享元模式来减少系统中对象的数量. 对象的大部分状态都可以外部化,可这些外部状态传入对象. 3. 享元设计模式UML类图 角色介绍 FlyWeight:享元对象抽象基

《Android源码设计模式解析与实战》读书笔记(二十二)

第二十二章.享元模式 享元模式是结构型设计模式之一,是对对象池的一种实现.就像它的名字一样,共享对象,避免重复的创建.我们常用的String 就是使用了共享模式,所以String类型的对象创建后就不可改变,如果当两个String对象所包含的内容相同时,JVM只创建一个String对象对应这两个不同的对象引用. 1.定义 采用一个共享来避免大量拥有相同内容对象的开销.使用享元模式可有效支持大量的细粒度对象. 2.使用场景 (1)系统中存在大量的相似对象. (2)细粒度的对象都具备较接近的外部状态,

《Android源代码设计模式解析与实战》读书笔记(二十二)

第二十二章.享元模式 享元模式是结构型设计模式之中的一个.是对对象池的一种实现.就像它的名字一样,共享对象.避免反复的创建. 我们经常使用的String 就是使用了共享模式.所以String类型的对象创建后就不可改变,假设当两个String对象所包括的内容同样时,JVM仅仅创建一个String对象相应这两个不同的对象引用. 1.定义 採用一个共享来避免大量拥有同样内容对象的开销.使用享元模式可有效支持大量的细粒度对象. 2.使用场景 (1)系统中存在大量的类似对象. (2)细粒度的对象都具备较接