CleverCode最近在看享元模式。
1 模式介绍
运用共享技术有效的支持大量细粒度的对象
2 模式中的角色
(1) 抽象享元角色:为具体享元角色规定了必须实现的方法,而外蕴状态就是以参数的形式通过此方法传入。在Java中可以由抽象类、接口来担当。
(2) 具体享元角色:实现抽象角色规定的方法。如果存在内蕴状态,就负责为内蕴状态提供存储空间。
(3) 享元工厂角色:负责创建和管理享元角色。要想达到共享的目的,这个角色的实现是关键!
(4) 客户端角色:维护对所有享元对象的引用,而且还需要存储对应的外蕴状态。
3 模式结构
4 项目
4.1 需求
设计一个网站可以共享,但是用户可以不同的场景。
4.2 源码
<?php
/**
* php享元模式
* copyright (c) http://blog.csdn.net/CleverCode
*
*/
//外部变化
class User
{/*{{{*/
public $name;
public function __construct($name)
{
$this->name = $name;
}
public function getName()
{
return $this->name;
}
}/*}}}*/
abstract class WebSite
{/*{{{*/
abstract function myUse(User $user);
}/*}}}*/
//具体的网站
class ConWebSite extends WebSite
{/*{{{*/
private $name;
public function __construct($name)
{
$this->name = $name;
}
public function getName()
{
return $this->name;
}
function myUse(User $user)
{
echo "网站:".$this->name." 用户:".$user->getName()."\r\n";
}
}/*}}}*/
//工厂
class WebSiteFactory
{/*{{{*/
private $hash = array();
public function getWebSite($key)
{
if(false == isset($this->hash[$key]))
{
$this->hash[$key] = new ConWebSite($key);
}
return $this->hash[$key];
}
}/*}}}*/
class Client
{/*{{{*/
public static function main($argv)
{
$webSiteFactory = new WebSiteFactory();
$boke = $webSiteFactory->getWebSite('博客');
$boke->myUse(new User('张三'));
$weiBo = $webSiteFactory->getWebSite('微博');
$weiBo->myUse(new User('王五'));
$boke2 = $webSiteFactory->getWebSite('博客');
$boke2->myUse(new User('李四'));
}
}/*}}}*/
Client::main($argv);
?>
4.3 结果展示
技术交流
CleverCode是一名架构师,技术交流,咨询问题,请加CleverCode创建的qq群(架构师俱乐部):517133582。加群和腾讯,阿里,百度,新浪等公司的架构师交流。【架构师俱乐部】宗旨:帮助你成长为架构师!