前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式专题(二十二) ——享元模式

设计模式专题(二十二) ——享元模式

作者头像
用户1327360
发布2018-03-07 11:55:15
6480
发布2018-03-07 11:55:15
举报
文章被收录于专栏:决胜机器学习

设计模式专题(二十二)——享元模式

(原创内容,转载请注明来源,谢谢)

一、概述

享元模式(Flyweight)是运用共享技术,有效地支持大量细粒度的对象。享元模式是通过将类的实例化进行共享,实现多个类的共用,如果某些类已经实例化,不需要再次实例化。

享元模式的数据分为内部状态和外部状态,内部状态不会随不同需求的变化而变化,外部状态根据不同的需求会有所不同。例如两个博客,共享底层的基础架构代码,但是其个性化部分、用户数据部分有所不同。

享元模式的优势:

享元模式可以避免大量细粒度的开销,把要开销的部分都存在一个公共的类中,以节约空间。

享元模式使用场景:

一个程序应用到大量的对象,这些对象造成很多的存储开销,而对象又多数情况下可以复用的情况。在java、C#等语言中,字符串对象就是一种享元模式的应用,因此相同值的字符串对象,其实质是用的同一个内存空间。

二、类图

三、程序实现

1、模块设计

享元模式共分为四个部分:

1)享元工厂,用于存放各种类的实例。

2)抽象享元类,用于定义一些共有的方法。

3)具体享元类,其分为可共享的和不可共享的两种。

4)客户端,调用享元类。

2、代码实现

代码语言:javascript
复制
//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

相关阅读:

设计模式专题(二十一) ——中介者模式

设计模式专题(二十) ——职责链模式

设计模式专题(十九) ——命令模式

设计模式专题(十八) ——桥接模式

设计模式专题(十七) ——单例模式

设计模式专题(十六)——迭代器模式

设计模式专题(十五) ——组合模式

设计模式专题(十四)——适配器模式

设计模式专题(十三) ——备忘录模式

设计模式专题(十二)——状态模式

设计模式专题(十一)——抽象工厂模式

设计模式专题(十)——观察者模式

设计模式专题(九) ——外观模式

设计模式专题(八) ——模板方法模式

设计模式专题(七)——建造者模式

设计模式专题(六)——原型模式

设计模式专题(五)——工厂方法模式

设计模式专题(四)——代理模式

设计模式专题(三)——装饰模式

设计模式专题(二)——策略模式

设计模式专题(一)——面向对象的设计原则

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-08-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 决胜机器学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 设计模式专题(二十一) ——中介者模式
  • 设计模式专题(二十) ——职责链模式
  • 设计模式专题(十九) ——命令模式
  • 设计模式专题(十八) ——桥接模式
  • 设计模式专题(十七) ——单例模式
  • 设计模式专题(十六)——迭代器模式
  • 设计模式专题(十五) ——组合模式
  • 设计模式专题(十四)——适配器模式
  • 设计模式专题(十三) ——备忘录模式
  • 设计模式专题(十二)——状态模式
  • 设计模式专题(十一)——抽象工厂模式
  • 设计模式专题(十)——观察者模式
  • 设计模式专题(九) ——外观模式
  • 设计模式专题(八) ——模板方法模式
  • 设计模式专题(七)——建造者模式
  • 设计模式专题(六)——原型模式
  • 设计模式专题(五)——工厂方法模式
  • 设计模式专题(四)——代理模式
  • 设计模式专题(三)——装饰模式
  • 设计模式专题(二)——策略模式
  • 设计模式专题(一)——面向对象的设计原则
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档