名詞解釋:
享元模式(flyweight):運用共享技術有效地支援大量細粒度的物件。
必要元素:
1.乙個享元工廠,用來建立並管理flyweight物件。它主要是用來確保合理地共享flyweight,當使用者請求乙個flyweight時,flyweightfactory物件提供乙個已建立的例項或者建立乙個(如果不存在);
2.所有具體享元類的父類或介面,通過這個介面,flyweight可以接受並作用於外部狀態;
3.繼承flyweight父類或者實現flyweight介面,並為內部狀態增加儲存空間;
4.指那些不需要共享的flyweight子類,因為flyweight介面共享成為可能,但是並不強制共享(即那些不能共享的部分)。
上例子:
flyweight享元抽象類:
abstractclass
flyweight
flyweight具體共享類:
classconcreteflyweight:flyweight
}class
unsharedconcreteflyweight:flyweight
}
享元工廠:
classflyweightfactory
public flyweight getflyweight(string
key)
}
呼叫:
//外部狀態
int extrinsicstate = 22
; flyweightfactory factory = new
flyweightfactory();
flyweight fx = factory.getflyweight("x"
); fx.operation(--extrinsicstate);
flyweight fy = factory.getflyweight("y"
); fx.operation(--extrinsicstate);
flyweight fz = factory.getflyweight("z"
); fz.operation(--extrinsicstate);
flyweight uf = new
unsharedconcreteflyweight();
uf.operation(--extrinsicstate);
console.read();
通過享元類父類和子類(共享和非共享部分)以及享元類工廠,構成了享元模式,這樣在使用的時候就不會建立多次物件,有效的利用資源。
抽象類:
//////**抽象類
/// abstract
class
website
//////具體**類
/// class
concretewebsite:website
public
override
void
use()
}
//////**工廠
/// class
websitefactory
return
flyweights[key];
}public
intgetwebsitecount()
}
使用:
websitefactory factory = newwebsitefactory();
website fx = factory.getwebsite("
產品展示");
fx.use();
website fy = factory.getwebsite("
產品展示");
fy.use();
website fz = factory.getwebsite("
產品展示");
fz.use();
website fl = factory.getwebsite("部落格"
); fl.use();
website fm = factory.getwebsite("部落格"
); fm.use();
website fn = factory.getwebsite("部落格"
); fn.use();
console.writeline(
"共有**個
",factory.getwebsitecount());
console.read();
這樣設計基本實現了享元模式的共享物件的目的,也就是說不管建立幾個**,只要是某一型別(部落格或者其他),都是完全相同的,但是問題又來了,不同公司的**應該有不同的賬號,所以我們只是體現了共享的部分,還有非共享部分等待我們實現。
例項2(整合非共享**):
外部狀態類(user類):
//////使用者類(外部狀態)
/// class
user
}public user(string
name)
}
//////**抽象類
/// abstract
class
website
方法增加了引數,引數為外部狀態物件user。
//////具體**類
/// class
concretewebsite:website
public
override
void
use(user user)
}
變化也是user函式新增user物件引數。
工廠:無變化。
使用:
websitefactory factory = newwebsitefactory();
website fx = factory.getwebsite("
產品展示");
fx.use(
new user("
colors
"));
website fy = factory.getwebsite("
產品展示");
fy.use(
new user("
blue
"));
website fz = factory.getwebsite("
產品展示");
fz.use(
new user("
listen
"));
website fl = factory.getwebsite("部落格"
); fl.use(
new user("
colors.blue
"));
website fm = factory.getwebsite("部落格"
); fm.use(
new user("
listen.fly
"));
website fn = factory.getwebsite("部落格"
); fn.use(
new user("
李莫愁"
)); console.writeline(
"共有**個
",factory.getwebsitecount());
console.read();
這樣雖然是同乙個型別的**,但是有了user這個外部狀態物件,所以就可以把內部狀態與外部狀態很好的結合。
總結:
如果乙個應用程式使用了大量的物件,而大量的物件造成了很大的儲存開銷時就應該考慮使用享元模式;物件的大多數狀態可以外部狀態,如果刪除物件的外部狀態,那麼可以用相對較少的共享物件取代很多組物件,此時可以考慮使用享元物件。在實際應用中,使用了享元模式例項總數就大大減少了。
設計模式之享元模式
1 享元模式運用共享技術有效地支援大量細粒度的物件。uml圖如下 2 思考 flyweight根據客戶需求返回已經生成好的物件,但一定要事先生成物件例項嗎?答 實際上是不一定需要的,完全可以初始化的時候什麼也不做,到需要的時候,再去判斷物件是否為null來決定是否例項化。3 思考 為什麼要有unsh...
設計模式之 享元模式
享元模式英文稱為 flyweight pattern 又譯為羽量級模式或者蠅量級模式。享元模式的定義為 採用乙個共享類來避免大量擁有相同內容的 小類 的開銷。這種開銷中最常見 直觀的影響就是增加了記憶體的損耗。享元模式以共享的方式高效的支援大量的細粒度物件,減少其帶來的開銷。在名字和定義中都體現出了...
設計模式之享元模式
享元模式運用共享技術有效地支援大量細粒度的物件。如果乙個應用程式使用了大量的物件,而大量的這些物件造成了很大的儲存開銷時應該考慮使用。物件的大多數狀態可以是外部狀態,如果刪除物件的外部狀態,那麼可以用相對較少的共享物件取代很多組物件,此時也可以考慮用享元模式。享元模式uml圖如下 如下 使用者 cl...