设计模式--享元模式C++实现
1定义
使用共享对象可有效的支持大量细粒度的对象
2类图
角色分析
Flyweight抽象享元角色,一个产品的抽象,定义内部状态和外部状态的接口或者实现
ConcreteFlyweight具体享元角色,实现抽象角色定义的业务。注:内部状态处理和环境无关
unsharedConcreteFlyweight不可共享的享元角色,不存在外部状态或者安全要求,不能够使用共性技术的对象,该对象一般不会出现在享元工厂中
Flyweight享元工厂,就是构造一个池容器,同时提供从翅中获得对象的方法
3实现
#pragma once
#include<hash_map>
#include<iostream>
using namespace std; class Flyweight
{
private:
//内部状态
string intrinsic;
protected:
//外部状态
const string extrainsic;
public:
Flyweight(string _ex)
:extrainsic ( _ex)
{
} //定义业务操作
virtual void operate(){}
string getIntrinsic()
{
return intrinsic;
}
void setIntrinsic(string _in)
{
intrinsic = _in;
}
}; class ConcreteFlyweight1 :public Flyweight
{
public:
ConcreteFlyweight1(string ex)
:Flyweight(ex)
{} void operate()
{
//根据外部逻辑进行业务处理
cout << "1根据外部逻辑进行业务处理!" << endl;
}
};
class ConcreteFlyweight2 :public Flyweight
{
public:
ConcreteFlyweight2(string ex)
:Flyweight(ex)
{} void operate()
{
//根据外部逻辑进行业务处理
cout << "2根据外部逻辑进行业务处理!" << endl;
}
};
class FlyweightFactory
{
private:
static hash_map<string, Flyweight*> pool;
public:
Flyweight* getFlyweight(string ex)
{
hash_map<string, Flyweight*>::iterator it = pool.find(ex);
if (it == pool.end())
{
cout << "Creat Flyweight1" << endl;
pool[ex] = new ConcreteFlyweight1(ex);
}
return pool[ex];
}
}; hash_map<string, Flyweight*> FlyweightFactory::pool = hash_map<string,Flyweight*>();
class Client
{
public:
void operator()()
{
FlyweightFactory ff;
Flyweight * pf = ff.getFlyweight("lianglihui");
pf->operate();
}
};
4应用
①优点
是一个简单的模式,可以大大减少程序创建的对象,降低内存占用,增强性能
②缺点
提高系统复杂性,需要分离状态,且外部状态不应该随着内部状态的改变而改变
③使用场景
系统中存在大量的相似对象
细粒度的对象都具有较接近的外部状态,而内部状态和环境无关。
需要缓冲池的场景
5扩展
① 线程安全问题,因为共享对象比较少,多个线程同时去访问通过外部状态对其内部状态访问就出现了线程安全问题。--》使用享元模式时,保证享元对象足够多,同时处理掉线程安全问题就好
②性能问题
优化:将外部状态封装成类,通过桥梁模式进行嫁接,减少耦合,提高效率/使用系统内置类型作为外部状态
(ps因为池中检测会有调用消耗)
6对象池vs享元模式
享元模式可以实现对象池
对象池着重在对象的复用,池中的每个对象都是可替换的,从同一个池中获得A对象和B对象对客户端来讲是完全相同的,主要解决复用。
享元模式侧重共享问题,如何建立多个可共享的细粒度对象则是其关注的重点。
设计模式--享元模式C++实现的更多相关文章
- 8. 星际争霸之php设计模式--享元模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- C++设计模式——享元模式
本文版权归果冻说所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利.如果这篇文章对你有帮助,你可以请我喝杯咖啡. » 本文链接:http:// ...
- java设计模式——享元模式
一. 定义与类型 定义:提供了减少对象数量从而改善应用所需的对象结构的方式,运用共享技术有效地支持大量细粒度的对象 类型:结构性 二. 使用场景 (1) 常常应用于系统底层的开发,以便解决系统的性能 ...
- 【设计模式】Java设计模式 - 享元模式
Java设计模式 - 享元模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起记录分享自己 ...
- [工作中的设计模式]享元模式模式FlyWeight
一.模式解析 Flyweight在拳击比赛中指最轻量级,即“蝇量级”或“雨量级”,这里选择使用“享元模式”的意译,是因为这样更能反映模式的用意.享元模式是对象的结构模式.享元模式以共享的方式高效地支持 ...
- JAVA 设计模式 享元模式
用途 享元模式 (Flyweight) 运用共享技术有效地支持大量细粒度的对象. 享元模式是一种结构型模式. 结构
- 深入浅出设计模式——享元模式(Flyweight Pattern)
模式动机 面向对象技术可以很好地解决一些灵活性或可扩展性问题,但在很多情况下需要在系统中增加类和对象的个数.当对象数量太多时,将导致运行代价过高,带来性能下降等问题.享元模式正是为解决这一类问题而诞生 ...
- Java设计模式-享元模式(Flyweight)
享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用. FlyWeightFactory负责创建和管理享元单元,当一个客户端请求时,工厂需要检查 ...
- java设计模式---享元模式
享元模式 顾名思义:共享元对象.如果在一个系统中存在多个相同的对象,那么只需要共享一份对象的拷贝,而不必为每一次使用创建新的对象. 享元模式是为数不多的.只为提升系统性能而生的设计模式.它的主要作用就 ...
- 结合JDK源码看设计模式——享元模式
前言 在说享元模式之前,你一定见到过这样的面试题 public class Test { public static void main(String[] args) { Integer a=Inte ...
随机推荐
- DB_FILE_MULTIBLOCK_READ_COUNT对物理读和IO次数的影响
当执行SELECT语句时,如果在内存里找不到相应的数据,就会从磁盘读取进而缓存至LRU末端(冷端),这个过程就叫物理读.当相应数据已在内存,就会逻辑读. 物理读是磁盘读,逻辑读是内存读:内存读的速度远 ...
- 关于js的异常
遇到异常,通常会有两种处理办法1.处理异常 try{ //可能出现异常的代码 }catch(e){ //处理异常 } 2.抛出异常 public void getName throws Excepti ...
- ResultMap和ResultType在使用中的区别
在使用mybatis进行数据库连接操作时对于SQL语句返回结果的处理通常有两种方式,一种就是resultType另一种就是resultMap,下面说下我对这两者的认识和理解 resultType:当使 ...
- ZOJ - 3229 Shoot the Bullet (有源汇点上下界最大流)
题意:要在n天里给m个女生拍照,每个女生有拍照数量的下限Gi,每天有拍照数量的上限Di,每天当中每个人有拍照的上限Lij和Rij.求在满足限制的基础上,所有人最大能拍多少张照片. 分析:抛开限制,显然 ...
- MVP架构学习
MVP架构学习 M:数据层(数据库,文件,网络等...) V:UI层(Activity,Fragment,View以及子类,Adapter以及子类) P:中介,关联UI层和数据层,因为V和M是相互看不 ...
- nginx添加sticky cookie 分流模块
需要下载nginx源码和sticky,在nginx配置文件中添加sticky模块,然后重新编译nginx. #准备安装基础环境:yum install gcc openssl-devel pcre-d ...
- java压缩多个文件
首先创建一个工具类,定义好接口,这里的参数1:fileList:多个文件的path+name2: zipFileName:压缩后的文件名 下面是代码,注释已经很详细了 public class ZIP ...
- Java-JVM调优常见配置举例
常见配置举例 堆大小设置JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制:系统的可用虚拟内存限制:系统的可用物理内存限制.32位系统 下,一般限制在1.5G~ ...
- innodb 行级锁
InnoDB行锁是通过给索引上的索引项加锁来实现的,这一点MySQL与Oracle不同,后者是通过在数据块中对相应数据行加锁来实现的.InnoDB这种行锁实现特点意味着:只有通过索引条件检索数据,In ...
- yield生成器函数
生成器有主要有四种方法: next() 执行函数,直到遇到下一个yield为止,并返回值 send(value) 为生成器发送一个数值,next()方法就相当于send(None) close() 终 ...