23種設計模式 10 Flyweight模式

2021-07-11 21:55:30 字數 2664 閱讀 6795

flyweight模式結構:

享元模式(flyweight):運用共享的技術有效地支援大量細粒度的物件。

抽象享元角色(flyweight):此角色是所有的具體享元類的超類,為這些類規定出需要實現的公共介面或抽象類。那些需要外部狀態(external state)的操作可以通過方法的引數傳入。抽象享元的介面使得享元變得可能,但是並不強制子類實行共享,因此並非所有的享元物件都是可以共享的。

具體享元(concreteflyweight)角色:實現抽象享元角色所規定的介面。如果有內部狀態的話,必須負責為內部狀態提供儲存空間。享元物件的內部狀態必須與物件所處的周圍環境無關,從而使得享元物件可以在系統內共享。有時候具體享元角色又叫做單純具體享元角色,因為復合享元角色是由單純具體享元角色通過復合而成的。

復合享元(unsharableflyweight)角色:復合享元角色所代表的物件是不可以共享的,但是乙個復合享元物件可以分解成為多個本身是單純享元物件的組合。復合享元角色又稱做不可共享的享元物件。這個角色一般很少使用。

享元工廠(flyweightfactoiy)角色:本角色負責建立和管理享元角色。本角色必須保證享元物件可以被系統適當地共享。當乙個客戶端物件請求乙個享元物件的時候,享元工廠角色需要檢查系統中是否已經有乙個符合要求的享元物件,如果已經有了,享元工廠角色就應當提供這個已有的享元物件;如果系統中沒有乙個適當的享元物件的話,享元工廠角色就應當建立乙個新的合適的享元物件。

客戶端(client)角色:本角色還需要自行儲存所有享元物件的外部狀態。

內部狀態與外部狀態:在享元物件內部並且不會隨著環境改變而改變的共享部分,可以稱之為享元物件的內部狀態,反之隨著環境改變而改變的,不可共享的狀態稱之為外部狀態。

**實現:關於字元處理

document.h

#ifndef _document_h_

#define _document_h_

#include #include using namespace std;

// the 'flyweight' abstract class

class character

;//a 'concreteflyweight' class

class charactera:public character

;//b 'concreteflyweight' class

class characterb:public character

;//c 'concreteflyweight' class

class characterc:public character

;//d 'concreteflyweight' class

class characterd:public character;/*

...*/

//the 'flyweightfactory' class

class characte***ctory

;#endif

#include "document.h"

#include character::character(char c)

character::~character()

charactera::charactera(char c):character(c)

charactera::~charactera()

char charactera::getsymbol()

void charactera::display(int width,int height,int ascent,int descent,int pointsize)

characte***ctory::characte***ctory()

{}characte***ctory::~characte***ctory()

{}character* characte***ctory::getcharacter(char c)

}character* pf = new charactera(c);

this->m_veccharacter.push_back(pf);

return pf;

}vector::size_type characte***ctory::getcount()

client

//#include "flyweight.h"

#include "document.h"

#include #include using namespace std;

int main()

vector::size_type sizechar = pcf->getcount();

cout << "count:" << sizechar << endl;

return 0;

}

每個flyweight都有相應的外部狀態和內部狀態,不過外部狀態需要傳遞引數通過函式呼叫來表現,所以外部狀態需要另外的儲存位置。

****:

23種設計模式 10 組合模式

一 常規實現 不安全 產品類 public abstract class product public string name 每個產品都可以工作 public abstract void work 每個產品都可以往裡面再新增子產品 至於有些產品不能再新增子產品,這裡我們一會會詳細說,大家先記住這一...

設計模式 23種設計模式

一 軟體設計模式的概念 軟體設計模式 software design pattern 又稱設計模式,是一套被反覆使用 多數人知曉的 經過分類編目的 設計經驗的總結。它描述了在軟體設計過程中的一些不斷重 生的問題,以及該問題的解決方案。也就是說,它是解決特定問題的一系列套路,是前輩們的 設計經驗的總結...

23種設計模式

建立型 1.單件模式 singleton pattern 2.抽象工廠 abstract factory 3.建造者模式 builder 4.工廠方法模式 factory method 5.原型模式 prototype 結構型 6.介面卡模式 adapter pattern 7.橋接模式 bridg...