设计模式专题(二十二)——享元模式
(原创内容,转载请注明来源,谢谢)
一、概述
享元模式(Flyweight)是运用共享技术,有效地支持大量细粒度的对象。享元模式是通过将类的实例化进行共享,实现多个类的共用,如果某些类已经实例化,不需要再次实例化。
享元模式的数据分为内部状态和外部状态,内部状态不会随不同需求的变化而变化,外部状态根据不同的需求会有所不同。例如两个博客,共享底层的基础架构代码,但是其个性化部分、用户数据部分有所不同。
享元模式的优势:
享元模式可以避免大量细粒度的开销,把要开销的部分都存在一个公共的类中,以节约空间。
享元模式使用场景:
一个程序应用到大量的对象,这些对象造成很多的存储开销,而对象又多数情况下可以复用的情况。在java、C#等语言中,字符串对象就是一种享元模式的应用,因此相同值的字符串对象,其实质是用的同一个内存空间。
二、类图
三、程序实现
1、模块设计
享元模式共分为四个部分:
1)享元工厂,用于存放各种类的实例。
2)抽象享元类,用于定义一些共有的方法。
3)具体享元类,其分为可共享的和不可共享的两种。
4)客户端,调用享元类。
2、代码实现
//1.抽象享元类
abstract class Flyweight{
public functionexecute($params){}
}
//2.具体享元类--可公用
class FlyweightCommonA{
private $prop;
public function__construct($prop){
$this->prop= $prop;
}
public functionexecute($params){
//...A类的处理方式
//$this->prop->....
}
}
class FlyweightCommonB{
private $prop;
public function__construct($prop){
$this->prop= $prop;
}
public functionexecute($params){
//...B类的处理方式
//$this->prop->....
}
}
//3.具体享元类--私有
class FlyweightPrivate{
private $prop;
public function__construct($prop){
$this->prop= $prop;
}
public functionexecute($params){
//...私有类的处理方式
//$this->prop->....
}
}
//4.享元工厂
class FlyweightFactory{
private$arrFlyweights;
//array(array(key=>key,obj=>flyweight),...)形式
public function__construct(array $flyweights = array()){
if(!empty($flyweights)){
$this->setFlyweights($flyweights);
}else{
$this->arrFlyweights= $flyweights;
}
}
public functionsetFlyweights(array $flyweights){
if(empty($flyweights)){
return;
}
foreach($flyweightsas $flyweight){
if(!isset($this->arrFlyweights[$flyweight['key']])){
$this->arrFlyweights[$flyweight['key']]
=new $flyweight['obj'];
}
}
}
public functiongetFlyweight($key){
if(isset($this->arrFlyweights[$key])){
return$this->arrFlyweights[$key];
}else{
returnnull;
}
}
}
//5.客户端
$fw = new FlyweightFactory(
array('key'=>'FlyweightCommonA','obj'=>new FlyweightCommonA())
);
$fw->setFlyweights(
array('key'=>'FlyweightCommonB','obj'=>new FlyweightCommonB())
);
$fw->getFlyweight('FlyweightCommonA')->execute(array());
—written by linhxx 2017.08.30
相关阅读: