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++实现的更多相关文章

  1. 8. 星际争霸之php设计模式--享元模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  2. C++设计模式——享元模式

    本文版权归果冻说所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利.如果这篇文章对你有帮助,你可以请我喝杯咖啡. » 本文链接:http:// ...

  3. java设计模式——享元模式

    一. 定义与类型 定义:提供了减少对象数量从而改善应用所需的对象结构的方式,运用共享技术有效地支持大量细粒度的对象 类型:结构性 二. 使用场景 (1)  常常应用于系统底层的开发,以便解决系统的性能 ...

  4. 【设计模式】Java设计模式 - 享元模式

    Java设计模式 - 享元模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起记录分享自己 ...

  5. [工作中的设计模式]享元模式模式FlyWeight

    一.模式解析 Flyweight在拳击比赛中指最轻量级,即“蝇量级”或“雨量级”,这里选择使用“享元模式”的意译,是因为这样更能反映模式的用意.享元模式是对象的结构模式.享元模式以共享的方式高效地支持 ...

  6. JAVA 设计模式 享元模式

    用途 享元模式 (Flyweight) 运用共享技术有效地支持大量细粒度的对象. 享元模式是一种结构型模式. 结构

  7. 深入浅出设计模式——享元模式(Flyweight Pattern)

    模式动机 面向对象技术可以很好地解决一些灵活性或可扩展性问题,但在很多情况下需要在系统中增加类和对象的个数.当对象数量太多时,将导致运行代价过高,带来性能下降等问题.享元模式正是为解决这一类问题而诞生 ...

  8. Java设计模式-享元模式(Flyweight)

    享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用. FlyWeightFactory负责创建和管理享元单元,当一个客户端请求时,工厂需要检查 ...

  9. java设计模式---享元模式

    享元模式 顾名思义:共享元对象.如果在一个系统中存在多个相同的对象,那么只需要共享一份对象的拷贝,而不必为每一次使用创建新的对象. 享元模式是为数不多的.只为提升系统性能而生的设计模式.它的主要作用就 ...

  10. 结合JDK源码看设计模式——享元模式

    前言 在说享元模式之前,你一定见到过这样的面试题 public class Test { public static void main(String[] args) { Integer a=Inte ...

随机推荐

  1. 微信js-sdk使用

    <?php $appid=""; $secret=""; class JSSDK { private $appId; private $appSecret ...

  2. 算法总结之动态规划(DP)

    适用动态规划的特点 所解决的问题是最优化问题. 所解决的问题具有"最优子结构".可以建立一个递推关系,使得n阶段的问题,可以通过几个k<n阶段的低阶子问题的最优解来求解. 具 ...

  3. STL make_heap push_heap pop_heap sort_heap

    make_heap: default (1) template <class RandomAccessIterator> void make_heap (RandomAccessItera ...

  4. Parallel Programming-实现并行操作的流水线(生产者、消费者)

    本文介绍如何使用C#实现并行执行的流水线(生产者消费者): 1.流水线示意图 2.实现并行流水线 一.流水线示意图 上图演示了流水线,action1接收input,然后产生结果保存在buffer1中, ...

  5. iOS学习之HelloWorld工程

    本文应读者要求,主要简介使用Xcode创建一个“HelloWorld”工程. 1.打开Xcode,点击新建工程 选择工程类型 2.填写工程信息 3.代码简介 // // main.m // hello ...

  6. PKU 2823 Sliding Window(线段树||RMQ||单调队列)

    题目大意:原题链接(定长区间求最值) 给定长为n的数组,求出每k个数之间的最小/大值. 解法一:线段树 segtree节点存储区间的最小/大值 Query_min(int p,int l,int r, ...

  7. nginx配置访问图片路径(windows)

    简介 Nginx(("engine x")由俄罗斯的程序设计师Igor Sysoev所开发)是一款自由的.开源的.高性能的HTTP服务器和反向代理服务器:同时也是一个IMAP.PO ...

  8. win下安装wget以及使用wget

    1. 安装wget网址:http://gnuwin32.sourceforge.net/packages/wget.htm下载http://downloads.sourceforge.net/gnuw ...

  9. POJ - 2125 Destroying The Graph (最小点权覆盖)

    题意:给一张图,现在要删去所有的边,删去一个点的所有入边和所有出边都有其对应\(W_{i+}\)和\(W_{i-}\).求删去该图的最小花费,并输出解 分析:简而言之就是用最小权值的点集去覆盖所有的边 ...

  10. sgu 103 Traffic Lights 解题报告及测试数据

    103. Traffic Lights Time limit per test: 0.25 second(s) Memory limit: 4096 kilobytes 题解: 1.其实就是求两点间的 ...