《設計模式之禪》——享元模式

       定義:Use sharing to support large numbers of fine-grained objects efficiently。(使用共享對象可有效地支持大量的細粒度的對象。)

       享元模式的定義爲我們提出了兩個要求:細粒度的對象和共享對象。要求細粒度對象,那麼不可避免地使得對象數量多且性質相近,那我們就將這些對象的信息分爲兩個部分:內部狀態(intrinsic)與外部狀態(extrinsic)。

  • 內部狀態:內部狀態是對象可共享出來的信息,存儲在享元對象內部並且不會隨環境改變而改變。
  • 外部狀態:外部狀態是對象得以依賴的一個標記,是隨環境改變而改變的、不可以共享的狀態。

       享元模式的通用類圖如圖所示。


       我們先來看我們享元模式角色名稱。

  • Flyweight抽象享元角色:它簡單地說就是一個產品的抽象類,同時定義出對象的外部狀態和內部狀態的接口和實現。
  • ConcreteFlyweight具體享元角色:具體的一個產品類,實現抽象角色定義的業務。該角色中需要注意的是內部狀態處理應該與環境無關,不應該出現一個操作改變了內部狀態,同時修改了外部狀態,這是絕對不允許的。
  • UnsharedConcreteFlyweight不可共享的享元角色:不存在外部狀態或者安全要求不能夠使用共享技術的對象,該對象一般不會出現在享元工廠中。
  • FlyweightFactory享元工廠:職責非常簡單,就是構造一個池容器,同時提供從池中獲得對象的方法。

       享元模式的目的在於運用共享技術,使得一些細粒度的對象可以共享,我們的設計確實也應該這樣,多使用細粒度的對象,便於重構或重用。


1.享元模式的應用


1.1享元模式的優點和缺點


       享元模式是一個非常簡單的模式,它可以大大減少應用程序創建的對象,降低程序內存的佔用,增強程序的性能,但它同時也提高了系統複雜性,需要分離外部狀態和內部狀態,而且外部狀態具有固化特性,不應該隨內部狀態改變而改變,否則導致系統的邏輯混亂。


1.2享元模式的使用場景


  • 系統中存在大量的相似對象。
  • 細粒度的對象都具備較接近的外部狀態,而且外部狀態與環境無關,也就是說對象沒有特定身份。
  • 需要緩衝池的場景。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章