舉個圍棋的例子,圍棋的棋盤共有361格,即可放361個棋子。現在要實現乙個圍棋程式,該怎麼辦呢?首先要考慮的是棋子棋盤的實現,可以定義乙個棋子的類,成員變數包括棋子的顏色、形狀、位置等資訊,另外再定義乙個棋盤的類,成員變數中有個容器,用於存放棋子的物件。下面給出**表示:
棋子的定義,當然棋子的屬性除了顏色和位置,還有其他的,這裡略去。這兩個屬性足以說明問題。
[cpp]view plain
copy
print?
//棋子顏色
enum
piececolor ;
//棋子位置
struct
piecepos
};
//棋子定義
class
piece
~piece() {}
virtual
void
draw() {}
};
class
blackpiece:
public
piece
~blackpiece() {}
void
draw() ;
class
whitepiece:
public
piece
~whitepiece() {}
void
draw() ;
棋盤的定義:
[cpp]view plain
copy
print?
class
pieceboard
~pieceboard()
void
setpiece(piececolor color, piecepos pos)
//一步棋,在棋盤上放一顆棋子
else
m_vecpiece.push_back(piece); //加入容器中
} void
clear()
//釋放記憶體
};
客戶的使用方式如下:
[cpp]view plain
copy
print?
intmain()
可以發現,棋盤的容器中存放了已下的棋子,而每個棋子包含棋子的所有屬性。一盤棋往往需要含上百顆棋子,採用上面這種實現,占用的空間太大了。如何改進呢?用享元模式。其定義為:運用共享技術有效地支援大量細粒度的物件。
在圍棋中,棋子就是大量細粒度的物件。其屬性有內在的,比如顏色、形狀等,也有外在的,比如在棋盤上的位置。內在的屬性是可以共享的,區分在於外在屬性。因此,可以這樣設計,只需定義兩個棋子的物件,一顆黑棋和一顆白棋,這兩個物件含棋子的內在屬性;棋子的外在屬性,即在棋盤上的位置可以提取出來,存放在單獨的容器中。相比之前的方案,現在容器中僅僅存放了位置屬性,而原來則是棋子物件。顯然,現在的方案大大減少了對於空間的需求。
關注pieceboard 的容器,之前是vectorm_vecpiece,現在是vectorm_vecpos。這裡是關鍵。
棋子的新定義,只包含內在屬性:
[cpp]view plain
copy
print?
//棋子顏色
enum
piececolor ;
//棋子位置
struct
piecepos
};
//棋子定義
class
piece
~piece() {}
virtual
void
draw() {}
};
class
blackpiece:
public
piece
~blackpiece() {}
void
draw()
};
class
whitepiece:
public
piece
~whitepiece() {}
void
draw()
};
相應棋盤的定義為:
[cpp]view plain
copy
print?
class
pieceboard
~pieceboard()
void
setpiece(piececolor color, piecepos pos)
else
m_vecpos.push_back(pos);
} };
客戶的使用方式一樣,這裡不重複給出,現在給出享元模式的uml圖,以圍棋為例。棋盤中含兩個共享的物件,黑棋子和白棋子,所有棋子的外在屬性都存放在單獨的容器中。
設計模式(享元模式)
享元模式是設計模式中少數幾個已提高系統效能為目的模式之一。它的核心思想是 如果系統存在多個 相同的物件,那麼只需要共享一分物件的拷貝,而不必為每一次使用都建立新的物件。當有物件被大量復用時,特別是重量級的物件復用可以使用享元模式來提高系統效能。其優點如下 1.可以節省重複建立物件的開銷,因為被享元模...
設計模式 享元模式
享元模式flyweight flyweight 模式是乙個提高程式效率和效能的模式 會大大加快程式的執行速度。把物件中使用比較多,具有共同點的,拿出來做成乙個共享類,這樣就行成了共享模式。如 integer 物件在 128 127 使用的是同乙個物件。在這之間是共享的。享元中的角色 flyweigh...
設計模式 享元模式
flyweight,運用共享技術有效的支援大量細粒度的物件。它使用共享物件,用來盡可能減少記憶體使用量以及分享資訊給盡可能多的相似物件 它適合用於只是因重複而導致使用無法令人接受的大量記憶體的大量物件。通常物件中的部分狀態是可以分享。常見做法是把它們放在外部資料結構,當需要使用時再將它們傳遞給享元。...