设计模式C++描述----12.享元(Flyweight)模式
一. 概述
在面向对象系统的设计何实现中,创建对象是最为常见的操作。
这里面就有一个问题:如果一个应用程序使用了太多的对象,就会造成很大的存储开销。特别是对于大量轻量级(细粒度)的对象,比如在文档编辑器的设计过程中,我们如果没有为字母创建一个对象的话,系统可能会因为大量的对象而造成存储开销的浪费。
例如一个字母“a”在文档中出现了100000次,而实际上我们可以让这一万个字母“a”共享一个对象,当然因为在不同的位置可能字母“a”有不同的显示效果(例如字体和大小等设置不同),在这种情况我们可以为将对象的状态分为“外部状态”和“内部状态”,将可以被共享(不会变化)的状态作为内部状态存储在对象中,而外部对象(例如上面提到的字体、大小等)我们可以在适当的时候将外部对象最为参数传递给对象(例如在显示的时候,将字体、大小等信息传递给对象)。
二. 享元模式
定义:运用共享技术有效地支持大量细粒度的对象。
结构图如下:
Flyweight:所有具体享元类的父类,或接口
ConcreteFlyweight:具体享元类,实现具体的操作
UnshareConcreteFlyweight:不需要共享的子类
FlyweightFactory:合理的创建并管理享元类
代码如下:
- //享元类
- class Flyweight
- {
- public:
- virtual ~Flyweight() {}
- virtual void Operation(const string& extrinsicState) {}
- string GetIntrinsicState()
- {
- return this->_intrinsicState;
- }
- protected:
- Flyweight(string intrinsicState)
- {
- this->_intrinsicState = intrinsicState;
- }
- private:
- string _intrinsicState;
- };
- //具体享元类
- class ConcreteFlyweight:public Flyweight
- {
- public:
- ConcreteFlyweight(string intrinsicState):Flyweight(intrinsicState)
- {
- cout<<"ConcreteFlyweight Build....."<<intrinsicState<<endl;
- }
- ~ConcreteFlyweight() {}
- //实现接口
- void Operation(const string& extrinsicState)
- {
- cout<<"内部["<<this->GetIntrinsicState()<<"] 外部["<<extrinsicState<<"]"<<endl;
- }
- };
- //享元工厂
- class FlyweightFactory
- {
- public:
- FlyweightFactory() {}
- ~FlyweightFactory() {}
- //确保合理的共享 Flyweight
- Flyweight* GetFlyweight(const string& key)
- {
- vector<Flyweight*>::iterator it = _fly.begin();
- for (; it != _fly.end();it++)
- {
- if ((*it)->GetIntrinsicState() == key)
- {
- cout<<"already created by users...."<<endl;
- return *it;
- }
- }
- Flyweight* fn = new ConcreteFlyweight(key);
- _fly.push_back(fn);
- return fn;
- }
- private:
- vector<Flyweight*> _fly;
- };
- //测试
- int main(int argc,char* argv[])
- {
- FlyweightFactory* fc = new FlyweightFactory();
- //不同的对象,享元工厂将会创建新的享元类
- Flyweight* fw1 = fc->GetFlyweight("Object A");
- Flyweight* fw2 = fc->GetFlyweight("Object B");
- //相同的对象,享元工厂将会使用一个已创建的享元类
- Flyweight* fw3 = fc->GetFlyweight("Object A");
- return 0;
- }
三. 说明
1. 享元工厂类是重点,因为它创建并管理享元对象,对没有的对象它会创建,对已有的对象它会提供一个已创建的实例。
2. 可以想像有一个对象池,里面都是一些享元类,享元工厂的作用就是从对象池里取对象。
3. 它的目的是大幅度地减少需要实例化的类的数量。
设计模式C++描述----12.享元(Flyweight)模式的更多相关文章
- Java 实现享元(Flyweight)模式
/** * 字母 * @author stone * */ public class Letter { private String name; public Letter(String name) ...
- 十二、享元(Flyweight)模式--结构模式(Structural Pattern)
Flyweight在拳击比赛中指最轻量级,即"蝇量级",有些作者翻译为"羽量级".这里使用"享元 模式"更能反映模式的用意. 享元模式以共享 ...
- 设计模式的征途—12.享元(Flyweight)模式
现在在大力推行节约型社会,“浪费可耻,节俭光荣”.在软件系统中,有时候也会存在资源浪费的情况,例如,在计算机内存中存储了多个完全相同或者非常相似的对象,如果这些对象的数量太多将导致系统运行代价过高.那 ...
- python 设计模式之享元(Flyweight)模式
#写在前面 这个设计模式理解起来很容易.百度百科上说的有点绕口. #享元模式的定义 运用共享技术来有効地支持大量细粒度对象的复用. 它通过共享已经存在的对橡大幅度减少需要创建的对象数量.避免大量相似类 ...
- 享元(FlyWeight)模式
享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能.这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式.享元模式尝试 ...
- 十一、结构模式之享元(Flyweight)模式
什么是享元模式 享元模式是对象的结构模式,是运用共享技术来有效的支持大量细粒度的对象.享元对象能做到共享的关键是区分内蕴状态和外蕴状态.一个内蕴状态是存储在享元对象内部,并且是不会随环境改变而有所不同 ...
- 设计模式(十)享元模式Flyweight(结构型)
设计模式(十)享元模式Flyweight(结构型) 说明: 相对于其它模式,Flyweight模式在PHP实现似乎没有太大的意义,因为PHP的生命周期就在一个请求,请求执行完了,php占用的资源都被释 ...
- Java设计模式(十一) 享元模式
原创文章,同步发自作者个人博客 http://www.jasongj.com/design_pattern/flyweight/.转载请注明出处 享元模式介绍 享元模式适用场景 面向对象技术可以很好的 ...
- C#设计模式(12)——享元模式(Flyweight Pattern)
一.引言 在软件开发过程,如果我们需要重复使用某个对象的时候,如果我们重复地使用new创建这个对象的话,这样我们在内存就需要多次地去申请内存空间了,这样可能会出现内存使用越来越多的情况,这样的问题是非 ...
随机推荐
- mysql创建数据库指定字符集和校对规则
mysql创建数据库的语法格式: CREATE DATABASE [IF NOT EXISTS] <数据库名> [[DEFAULT] CHARACTER SET <字符集名>] ...
- 阿里云服务器CentOS6.9 nexus私服配置
从nexus官网下载nexus版本. 下载地址如下:https://help.sonatype.com/repomanager2/download 如果要下载3.X版本的,可以把repomanager ...
- 【爬虫小程序:爬取斗鱼所有房间信息】Xpath(多进程版)
# 本程序亲测有效,用于理解爬虫相关的基础知识,不足之处希望大家批评指正 import requests from lxml import etree from multiprocessing imp ...
- java通过代理创建Conncection对象与自定义JDBC连接池
最近学习了一下代理发现,代理其实一个蛮有用的,主要是用在动态的实现接口中的某一个方法而不去继承这个接口所用的一种技巧,首先是自定义的一个连接池 代码如下 import java.lang.reflec ...
- j2ee开发之hibernate框架学习笔记
hibernate框架技术重点学习笔记 1.针对不同的数据库,有不同的数据库实现类,使其符号对应的数据库? mysqlDaoImpl oracleDaoImpl ... ... 2.对象和表记录的转换 ...
- SUSE Linux Enterprise 15 SP1 系统安装
从 SUSE Linux Enterprise Server 15 开始,安装媒体仅包含安装程序 - 一个用于安装.更新和注册 SUSE Linux Enterprise Server 的基于命令行的 ...
- 安装/删除MySQL数据库
MySQL的数据存储目录为data,data目录通常在C:\Documents and Settings\All Users\Application Data\MySQL\MySQL Server 5 ...
- 设计时数据源: 在ActiveReports中直接连接PostgreSql 数据库
在之前的博客中,我们学习了如何在运行时绑定PostgreSql 数据库,今天我们学习,如何直连PostgreSQL 数据库. 1. 安装PostgreSQL 的ODBC驱动程序 https://www ...
- 编程小技巧之 Linux 文本处理命令
合格的程序员都善于使用工具,正所谓君子性非异也,善假于物也.合理的利用 Linux 的命令行工具,可以提高我们的工作效率. 本文简单的介绍三个能使用 Linux 文本处理命令的场景,给大家开阔一下思路 ...
- Scala 学习笔记之集合(9) 集合常用操作汇总
object CollectionDemo10 { def main(args: Array[String]): Unit = { var ls = List[Int](1, 2, 3) //向后增加 ...