大話設計模式 享元模式

2021-06-08 00:39:47 字數 2240 閱讀 8460

享元模式可以避免大量非常相似類的開銷。在程式設計中,有時需要生成大量細粒度的類例項來表示資料。如果能發現這些例項除了幾個引數外基本上都是相同的,有時就能夠大幅度地減少需要例項化的類的數量。如果能把那些引數移到類例項的外面,在方法呼叫時將他們傳遞進來,就可以通過共享大幅度地減少單個例項的數目。

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

abstract class flyweight

//繼承flyweight超類或實現flyweight介面,並為內部狀態增加記憶體空間。

class concreteflyweight extends flyweight

}//不需要共享的flyweight子類。因為flyweight介面共享成為可能,但它並不強制共享

class unsharedconcreteflyweight extends flyweight

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

class flyweightfactory

public function getflyweight($key)

}//**外部狀態

//使用者

class user

public function __get($key)

public function __set($key, $value)

}//**抽象類

abstract class website

//具體**類

class concretewebsite extends website

//實現『myuse』方法

public function myuse(user $user)

}//**工廠類

class websitefactory

return $this->flyweights[$key];

} //獲得**分類總數

public function getwebsitecount()

}$f = new websitefactory();

$fx = $f->getwebsitecategory('產品展示');

$fx->myuse(new user('小菜'));

$fy = $f->getwebsitecategory('產品展示');

$fy->myuse(new user('大鳥'));

$fz = $f->getwebsitecategory('產品展示');

$fz->myuse(new user('嬌嬌'));

$fl = $f->getwebsitecategory('部落格');

$fl->myuse(new user('老頑童'));

$fm = $f->getwebsitecategory('部落格');

$fm->myuse(new user('桃谷六仙'));

$fn = $f->getwebsitecategory('部落格');

$fn->myuse(new user('南海鱷神'));

echo '得到**分類總數為'.$f->getwebsitecount();

《大話設計模式 享元模式》筆記

1 享元模式 flyweight 運用共享技術有效的支援大量細顆粒度的物件。2 享元模式結構圖 3 簡單 實現 flyweight類,它是所有享元類的超類或介面,通過這個介面,flyweight可以接受並作用於外部狀態。public abstract class flyweightconcretef...

java 享元模式(大話設計模式)

所有具體享元類的超類,接受並作用於外部狀態 author administrator public abstract class flyweight class concreteflyweight extends flyweight class unsharedconcreteflyweight e...

大話設計模式之享元模式

享元模式 運用共享技術有效地支援大量細粒度的物件。內部狀態與外部狀態 享元模式可以避免大量非常相類似類的開銷。在程式設計中,有時需要生成大量細粒度的類例項來表示資料。如果能發現這些例項除了幾個引數外基本都是相同的,有時就能夠受大幅度地減少需要例項化數量的類的數量。如果能把那些引數轉移到類例項的外面,...