享元模式(Flyweight Pattern):運用共享技術(shù)有效地支持大量細(xì)粒度對象的復(fù)用造锅。系統(tǒng)值使用少量的對象,而這些對象都很相似展东,狀態(tài)變化很小柜思,可以實現(xiàn)對象的多次復(fù)用岩调。由于享元模式要求能夠共享的對象必須是細(xì)粒度對象,因此它又稱為輕量級模式赡盘,它是一種對象結(jié)構(gòu)型模式号枕。
角色分析:
1、享元工廠角色(FWFactory):創(chuàng)建并管理BlogModel對象陨享。
2葱淳、所有具體享元父接口角色(BlogModel):接受并作用于外部狀態(tài)。
3抛姑、具體享元角色(JobsBlog):具體變化點赞厕,為內(nèi)部對象增加儲存空間。
優(yōu)點:
1定硝、減少運行時對象實例的個數(shù)皿桑,節(jié)省內(nèi)存;
2蔬啡、將許多“虛擬”對象的狀態(tài)集中管理诲侮。
缺點:
一旦被實現(xiàn),單個的邏輯實現(xiàn)將無法擁有獨立而不同的行為箱蟆。
使用場景:
當(dāng)一個類有許多的實例沟绪,而這些實例能被同一個方法控制的時候,我們就可以使用享元模式空猜。
例:
/*所有享元父接口角色
*Interface IBlogModel
*/
interface IBlogModel()
{
??? function showTime();
??? function showColor();
}
/*喬布斯的博客模板
*Class JobsBlog
*/
class JobsBlog implements IBlogModel
{
??? function showTime()
??? {
??????? echo "紐約時間:五點整<br>";
??? }
??? function showColor()
??? {
??????? echo "Jobs";
??? }
}
/*雷軍博客模板
*Class
*/
Class LeiJunBlog implements IBlogModel
{
??? function showTime()
??? {
??????? echo "北京時間:17點整<br>";
??? }
??? function showColor()
??? {
??????? echo "雷軍";
??? }
}
/*博客模板工廠
*Class BlogFactory
*/
class BlogFactory
{
??? private $model=array();
??? function getBlogModel($name)
??? {
??????? if(isset($this->model[$name]))
??????? {
??????????? echo "我是緩存里的<br/>";
??????????? return $this->model[$name];
??????? }
??????? else
??????? {
??????????? try
??????????? {
??????????????? echo "我是新創(chuàng)建的<br/>";
???????????????$class=new ReflectionClass($name);
???????????????$this->model[$name]=$class->newInstance();
???????????????return $this->model[$name];
??????????? }
??????????? catch(ReflectionException $e)
??????????? {
??????????????? echo "你要求的對象我不能創(chuàng)建哦绽慈。";
??????????????? return null;
??????????? }
??????? }
??? }
}
header("Content-Type:text/html;charset=utf-8");
$factory=new BlogFactory();
$jobs=$factory->getBlogModel("JobsBlog");
if($jobs)
{
? ? $jobs->showTime();
? ? $jobs->showColor();
}
$jobs1=$factory->getBlogModel("JobsBlog");
if($jobs1)
{
? ? $jobs1->showTime();
? ? $jobs1->showColor();
}
$leijun=$factory->getBlogModel("LeiJunBlog");
if($leijun)
{
? ? $leijun->showTime();
? ? $leijun->showColor();
}
$leijun1=$factory->getBlogModel("LeiJunBlog");
if($leijun1)
{
? ? $leijun1->showTime();
? ? $leijun1->showColor();
}
$aFanda=$factory->getBlogModel("aFanda");
if($aFanda)
{
? ? $aFanda->showTime();
? ? $aFanda->showColor();
}
享元模式使用共享物件,用來盡可能減少內(nèi)存使用量以及分享資訊給盡可能多的相似物件辈毯;它適合用于只是因重復(fù)而導(dǎo)致使用無法令人接受的大量內(nèi)存的大量物件久信。通常物件中的部分狀態(tài)是可以分享。常見做法是把它們放在外部數(shù)據(jù)結(jié)構(gòu)漓摩,當(dāng)需要使用時再將它們傳遞給享元。