設計模式之享元模式

2022-03-21 08:31:01 字數 4205 閱讀 8137

名詞解釋:

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

必要元素:

1.乙個享元工廠,用來建立並管理flyweight物件。它主要是用來確保合理地共享flyweight,當使用者請求乙個flyweight時,flyweightfactory物件提供乙個已建立的例項或者建立乙個(如果不存在);

2.所有具體享元類的父類或介面,通過這個介面,flyweight可以接受並作用於外部狀態;

3.繼承flyweight父類或者實現flyweight介面,並為內部狀態增加儲存空間;

4.指那些不需要共享的flyweight子類,因為flyweight介面共享成為可能,但是並不強制共享(即那些不能共享的部分)。

上例子:

flyweight享元抽象類:

abstract

class

flyweight

flyweight具體共享類:

class

concreteflyweight:flyweight

}class

unsharedconcreteflyweight:flyweight

}

享元工廠:

class

flyweightfactory

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 = new

websitefactory();

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 = new

websitefactory();

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...