設計模式之享元(flyweight)模式

2022-04-22 16:10:31 字數 2334 閱讀 4674

現在在大力推行節約型社會,「浪費可恥,節儉光榮」。在軟體系統中,有時候也會存在資源浪費的情況,例如,在計算機記憶體中儲存了多個完全相同或者非常相似的物件,如果這些物件的數量太多將導致系統執行代價過高。那麼,是否存在一種技術可以用於節約記憶體使用空間,實現對這些相同或者相似物件的共享訪問呢?答案是肯定的,這種技術就是享元模式。

享元(flyweight)模式:運用共享技術有效地支援大量細粒度物件的復用。系統只使用少量的物件,而這些物件都很相似,狀態變化很小,可以實現物件的多次復用。由於享元模式要求能夠共享的物件必須是細粒度物件,因此它又稱為輕量級模式,是一種結構型模式。

m公司開發部欲開發乙個圍棋軟體,其介面效果如下圖所示:

m公司開發人員通過對圍棋軟體進行分析,發現在圍棋棋盤中包含大量的黑子和白子,它們的形狀、大小都一模一樣,只是出現的位置不同而已。如果將每乙個棋子都作為乙個獨立的物件儲存在記憶體中,將可能導致該圍棋軟體在執行時所需要的記憶體空間較大。

如何降低執行代價、提高系統效能是m公司開發人員需要解決的乙個問題。為此,m公司開發人員決定使用享元模式來設計該軟體。

#pragma once#include 

#include

using

namespace

std;

class

abstractpiece

~abstractpiece(){}

virtual

string getcolor() = 0

;

virtual

void display(ccoordinates *pcoodinates) = 0

;};

class writepiece : public

abstractpiece

~writepiece()

string

getcolor()

void display(ccoordinates *pcoodinates)

};

class blackpiece : public

abstractpiece

~blackpiece()

string

getcolor()

void display(ccoordinates *pcoodinates)

};

class

ccoordinates

~ccoordinates(){}

public

:

intm_x;

intm_y;

};

#pragma once#include 

"flyweight.h

"#include

using

namespace

std;

class

cpiecefactor

;

#include "

piecefactor.h"//

飢餓模式的單例模式

可以極大減少記憶體中物件的數量,使得相同或相似物件在記憶體中只有乙份 => 節省系統資源,提高系統效能!棒棒噠!

為了使物件可以共享,享元模式需要將享元物件的部分狀態外部化,而讀取外部狀態將使得執行時間變長!

(1)乙個系統有大量相同或相似的物件,造成了系統記憶體的大量損耗 => 趕緊使用享元模式吧!

(2)物件的大部分狀態都可以外部化,可以將這些外部狀態傳入物件中。

(3)要維護享元模式,需要耗費一定的系統資源,因為在需要時會多次重複使用才值得使用享元模式了!

Java設計模式 享元模式(Flyweight)

缺點 抽象享元角色 flyweight 抽象享元角色 author yanbin version 2018 5 28 11 36 public inte ce flyweight 具體享元角色 concreteflyweight 具體享元角色 author yanbin version 2018 5...

設計模式之享元

設計模式之享元模式 flyweight 何謂享元 首先我們解釋一下什麼是享元?這裡所說的享元出自大名鼎鼎的設計模式一書,英文 flyweight 中文由誰翻譯成 享元 一詞已不可考,但不得不說,這個翻譯實在是精彩 望文即可生意,比起洋鬼子的 flyweight 高明太多。這不免讓我等程式設計師被洋鬼...

設計模式之享元模式

1 享元模式運用共享技術有效地支援大量細粒度的物件。uml圖如下 2 思考 flyweight根據客戶需求返回已經生成好的物件,但一定要事先生成物件例項嗎?答 實際上是不一定需要的,完全可以初始化的時候什麼也不做,到需要的時候,再去判斷物件是否為null來決定是否例項化。3 思考 為什麼要有unsh...