Flyweight Pattern

1.Flyweight 模式以共享的方式高效的支持大量的细粒度对象,对象分为内部状态、外部状态。将可以被共享的状态作为内部状态存储在对象中,而外部状态在适当的时候作为参数传递给对象。

当以下所有的条件都满足时,可以考虑使用享元模式:

  • 一个系统有大量的对象。
  • 这些对象耗费大量的内存。
  • 这些对象的状态中的大部分都可以外部化。
  • 这些对象可以按照内蕴状态分成很多的组,当把外蕴对象从对象中剔除时,每一个组都可以仅用一个对象代替。
  • 软件系统不依赖于这些对象的身份,换言之,这些对象可以是不可分辨的。

2.Flyweight模式结构图(不想被共享的对象UnshaerConcreteFlyweight,暂不讨论)

3.实现

 1 #ifndef _FLYWEIGHT_H_
 2 #define _FLYWEIGHT_H_
 3
 4 #include <string>
 5 using namespace std;
 6
 7 class Flyweight
 8 {
 9 public:
10     virtual ~Flyweight();
11     virtual void Operation(const string& extrinsicState);
12     string GetIntrinsicState();
13 protected:
14     Flyweight(string intrinsicState);
15 private:
16     string _intrinsicState;
17 };
18
19 class ConcreteFlyweight:public Flyweight
20 {
21 public:
22     ConcreteFlyweight(string intrinsicState);
23     ~ConcreteFlyweight();
24     void Operation(const string& extrinsicState);
25 protected:
26 private:
27 };
28
29 #endif

Flyweight.h

 1 #include "Flyweight.h"
 2 #include <iostream>
 3 using namespace std;
 4
 5 Flyweight::Flyweight(string intrinsicState)
 6 {
 7     this->_intrinsicState = intrinsicState;
 8 }
 9 Flyweight::~Flyweight()
10 {
11
12 }
13 void Flyweight::Operation(const string& extrinsicState)
14 {
15
16 }
17 string Flyweight::GetIntrinsicState()
18 {
19     return this->_intrinsicState;
20 }
21 ConcreteFlyweight::ConcreteFlyweight(string intrinsicState):Flyweight(intrinsicState)
22 {
23     cout<<"ConcreteFlyweight Build....."<<intrinsicState<<endl;
24 }
25 ConcreteFlyweight::~ConcreteFlyweight()
26 {
27
28 }
29 void ConcreteFlyweight::Operation(const string& extrinsicState)
30 {
31     cout<<"ConcreteFlyweight:内蕴["<<this->GetIntrinsicState()<<"] 外蕴["<<extrinsicState<<"]"<<endl;
32 }

Flyweight.cpp

 1 #ifndef _FLYWEIGHTFACTORY_H_
 2 #define _FLYWEIGHTFACTORY_H_
 3
 4 #include "Flyweight.h"
 5 #include <string>
 6 #include <vector>
 7 using namespace std;
 8
 9 class FlyweightFactory
10 {
11 public:
12     FlyweightFactory();
13     ~FlyweightFactory();
14     Flyweight* GetFlyweight(const string& key);
15 protected:
16 private:
17     vector<Flyweight*> _fly;
18 };
19
20 #endif

FlyweightFactory.h

 1 #include "FlyweightFactory.h"
 2 #include <iostream>
 3 #include <string>
 4 #include <cassert>
 5 using namespace std;
 6 using namespace std;
 7
 8 FlyweightFactory::FlyweightFactory()
 9 {
10
11 }
12 FlyweightFactory::~FlyweightFactory()
13 {
14
15 }
16 Flyweight* FlyweightFactory::GetFlyweight(const string& key)
17 {
18     vector<Flyweight*>::iterator it = _fly.begin();
19     for (; it != _fly.end();it++)
20     { //找到了,就一起用,^_^
21         if ((*it)->GetIntrinsicState() == key)
22         {
23             cout<<"already created by users...."<<endl;
24             return *it;
25         }
26     }
27     Flyweight* fn = new ConcreteFlyweight(key);
28     _fly.push_back(fn);
29     return fn;
30 }

FlyweightFactory.cpp

 1 #include "Flyweight.h"
 2 #include "FlyweightFactory.h"
 3 #include <iostream>
 4 using namespace std;
 5
 6 int main(int argc,char* argv[])
 7 {
 8     FlyweightFactory* fc = new FlyweightFactory();
 9     Flyweight* fw1 = fc->GetFlyweight("hello");
10     Flyweight* fw2 = fc->GetFlyweight("world!");
11     Flyweight* fw3 = fc->GetFlyweight("hello");
12     return 0;
13 }

main.cpp

时间: 2024-08-30 02:36:22

Flyweight Pattern的相关文章

&quot;围观&quot;设计模式(17)--结构型之享元模式(Flyweight Pattern)

享元模式(英语:Flyweight Pattern)是一种软件设计模式.它使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件:它适合用于当大量物件只是重复因而导致无法令人接受的使用大量内存.通常物件中的部分状态是可以分享.常见做法是把它们放在外部数据结构,当需要使用时再将它们传递给享元.----WIKIPEDIA 个人理解 共享,内存消耗大的时候应考虑对象的共享,共享对象可以减少对象的生成数量,这样可以减少内存的消耗,当一个对象和其他的对象存在共性且内容一致的时候,可以将共有

享元模式(Flyweight Pattern)

享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度的对象. Flyweight是一个共享对象,它可以同时在多个场景(context)中使用,并且在每个场景中flyweight都可以作为一个独立的对象—这一点与非共享对象的实例没有区别.flyweight不能对它所运行的场景做出任何假设,这里的关键概念是内部状态和外部状态之间的区别.内部状态存储于flyweight中,它包含了独立于flyweight场景的信息,这些信息使得flyweight可以被共享.而外部状态取决于

二十四种设计模式:享元模式(Flyweight Pattern)

享元模式(Flyweight Pattern) 介绍运用共享技术有效地支持大量细粒度的对象. 示例有一个Message实体类,某些对象对它的操作有Insert()和Get()方法,现在要运用共享技术支持这些对象. MessageModel using System; using System.Collections.Generic; using System.Text; namespace Pattern.Flyweight { /// <summary> /// Message实体类 ///

设计模式(十二)享元模式(Flyweight Pattern)

一.引言 在软件开发过程,如果我们需要重复使用某个对象的时候,如果我们重复地使用new创建这个对象的话,这样我们在内存就需要多次地去申请内存空间了,这样可能会出现内存使用越来越多的情况,这样的问题是非常严重,然而享元模式可以解决这个问题,下面具体看看享元模式是如何去解决这个问题的. 二.享元模式的详细介绍 在前面说了,享元模式可以解决上面的问题了,在介绍享元模式之前,让我们先要分析下如果去解决上面那个问题,上面的问题就是重复创建了同一个对象,如果让我们去解决这个问题肯定会这样想:“既然都是同一个

NET设计模式 第二部分 结构性模式(12):享元模式(Flyweight Pattern)

享元模式(Flyweight Pattern) ——.NET设计模式系列之十三 Terrylee,2006年3月 摘要:面向对象的思想很好地解决了抽象性的问题,一般也不会出现性能上的问题.但是在某些情况下,对象的数量可能会太多,从而导致了运行时的代价.那么我们如何去避免大量细粒度的对象,同时又不影响客户程序使用面向对象的方式进行操作? 本文试图通过一个简单的字符处理的例子,运用重构的手段,一步步带你走进Flyweight模式,在这个过程中我们一同思考.探索.权衡,通过比较而得出好的实现方式,而不

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

模式动机 面向对象技术可以很好地解决一些灵活性或可扩展性问题,但在很多情况下需要在系统中增加类和对象的个数.当对象数量太多时,将导致运行代价过高,带来性能下降等问题.享元模式正是为解决这一类问题而诞生的.享元模式通过共享技术实现相同或相似对象的重用. 在享元模式中可以共享的相同内容称为内部状态(Intrinsic State),而那些需要外部环境来设置的不能共享的内容称为外部状态(Extrinsic State),由于区分了内部状态和外部状态,因此可以通过设置不同的外部状态使得相同的对象可以具有

第11章 享元模式(Flyweight Pattern)

原文 第11章 享元模式(Flyweight Pattern) 概述:   面向对象的思想很好地解决了抽象性的问题,一般也不会出现性能上的问题.但是在某些情况下,对象的数量可能会太多,从而导致了运行时的代价.那么我们如何去避免大量细粒度的对象,同时又不影响客户程序使用面向对象的方式进行操作?享元模式j就可以让我们更好的复用我们内存中已存在的对象,降低系统创建对象实例的性能消耗 运用共享技术有效地支持大量细粒度的对象.[GOF <设计模式>] 结构图:   举例: 为了方便说清享元模式的核心,我

java面向代码调优的设计模式之flyweight pattern

代码调优,实际上就是为了降低程序的时空代价.Flyweight Pattern允许在应用中不同部分共享使用objects,这个就可以大幅度的减少new的对象个数,降低大量objects带来的时空代价.应用flyweight pattern的对象其可分为内部特征(不管在什么场合使用该ovject,内部特征都不变)和外部特征(不是固定的,需要在不同场合分别计算并产生变化).这个外部特征就保证了同一个对象可以在不同的场合进行应用,不同的场合需要不同的对象特性,我们就可以通过修改外部对象特征的方式使同一

.NET设计模式(13):享元模式(Flyweight Pattern)(转)

摘要:面向对象的思想很好地解决了抽象性的问题,一般也不会出现性能上的问题.但是在某些情况下,对象的数量可能会太多,从而导致了运行时的代价.那么我们如何去避免大量细粒度的对象,同时又不影响客户程序使用面向对象的方式进行操作? 本文试图通过一个简单的字符处理的例子,运用重构的手段,一步步带你走进Flyweight模式,在这个过程中我们一同思考.探索.权衡,通过比较而得出好的实现方式,而不是给你最终的一个完美解决方案. 主要内容: 1.  Flyweight模式解说 2..NET中的Flyweight