设计模式之结构型模式—— 2.6 享元模式

<?php

/**
 * 2.6 享元模式
 *   定义:
 *       运用共享技术有效地支持大量细粒度的对象。
 *   角色:
 *       1. 抽象享元(Flyweight)类
 *           职责:所有具体享元类的超类或接口,
 *                 通过这个接口,享元类可以接
 *                 受并作用于外部状态。
 *       2. 具体享元类
 *           职责:继承享元抽象类,并为内部状态
 *                 增加存储空间。
 *       3. 非共享Unshared具体享元类
 *           职责:不需要共享的享元子类,因为抽
 *                 象享元类使共享成为可能,但它
 *                 并不强制共享。
 *       4. 享元工厂类
 *           职责:用来创建并管理享元对象。确保
 *                 合理的共享Flyweight,当用户请
 *                 求一个Flyweight时,享元工厂对
 *                 象提供一个以创建的实例或者创
 *                 建一个(如果不存在的话).
 *          
 *                 
 *           
 *   优点:
 *       1. 享元模式的优点在于它能够极大的减少系
 *          统中对象的个数。
 *       2. 享元模式由于使用了外部状态,外部状态
 *          相对独立,不会影响到内部状态,所以享
 *          元模式使得享元对象能够在不同的环境被
 *          共享。
 *   缺点:   
 *       1. 由于享元模式需要区分外部状态和内部状
 *          态,使得应用程序在某种程度上来说更加
 *          复杂化了。 
 *       2. 为了使对象可以共享,享元模式需要将享
 *          元对象的状态外部化,而读取外部状态使
 *          得运行时间变长。
 * 
 *   使用场景:
 *       1. 一个应用程序使用了大量的对象。
 *       2. 完全由于使用大量的对象,造成很大的存
 *          储开销。
 *       3. 对象的大多数状态都可变为外部状态。
 *       4. 如果删除对象的外部状态,那么可以用相
 *          对较少的共享对象取代很多组对象。
 *       5. 应用程序不依赖于对象标识。由于Flyweight
 *          对象可以被共享,对于概念上明显有别的对象
 *          ,标识测试将返回真值。
 *          
 */

//用户类
class User{
    private $name;
    public function __construct($name){
        $this->name=$name;
    }
    public function getName(){
        return $this->name;
    }
}

//网站抽象类
abstract class WebSite{
    abstract public function usage(User $user);
}

//具体网站类
class ConcreteWebSite extends WebSite{
    public $name;
    public function __construct($name){
        $this->name=$name;
    }

    public function usage(User $user){
        echo ‘网站分类:‘.$this->name.‘  用户:‘.$user->getName();
    }
}

//网站工厂类
class WebSiteFactory{
    private $flyweight=array();
    //获得网站分类
    public function getWebSiteCategory($key){
        if(!array_key_exists($key, $this->flyweight)){
            $this->flyweight[$key]=new ConcreteWebSite($key);
        }
        return $this->flyweight[$key];
    }

    //获得网站分类总数
    public function getWebSiteCount(){
        return count($this->flyweight);
    }
}

//客户端
$wsf=new WebSiteFactory();
$factoryShow1=$wsf->getWebSiteCategory(‘产品展示‘);
$factoryShow1->usage(new User(‘张三‘));
echo ‘<br/>‘;
//$factoryShow2和$factoryShow1使用的是同一个对象
//它们是对堆内存中的数据的两个引用而已。
$factoryShow2=$wsf->getWebSiteCategory(‘产品展示‘);
$factoryShow2->usage(new User(‘李四‘));
echo ‘<br/>‘;
echo $wsf->getWebSiteCount();

echo ‘<br/>‘;
$blog=$wsf->getWebSiteCategory(‘博客‘);
$blog->usage(new User(‘王五‘));
echo ‘<br/>‘;
echo $wsf->getWebSiteCount();

?>
时间: 2024-10-05 05:41:28

设计模式之结构型模式—— 2.6 享元模式的相关文章

12 【结构型】 浅谈享元模式的理解与使用

享元模式 享元模式也是为了减少对象的创建,进而减少内存的重复利用而被使用的,这个和之前我们学过的单例模式,还有原型模式有着近似的相同之处, 这里大致复习一下, 单例模式:系统内只存在一个对象,比如windows里面只会存在一个任务管理器,一样的道理. 原型模式:原型模式则是通过实现Cloneable接口,调用Object 的clone方法,生成一个相同的对象. 而享元模式,有一个关键词,那就是共享,这些对象创建好之后会被共享,比如我需要一个圆形,要是内存里面已经存在这个对象,直接将这个对象的引用

设计模式(十二): Flyweight享元模式 -- 结构型模式

说明: 相对于其它模式,Flyweight模式在PHP实现似乎没有太大的意义,因为PHP的生命周期就在一个请求,请求执行完了,php占用的资源都被释放.我们只是为了学习而简单做了介绍. 1. 概述 面向对象技术可以很好地解决系统一些灵活性或可扩展性或抽象性的问题,但在很多情况下需要在系统中增加类和对象的个数.当对象数量太多时,将导致运行代价过高,带来性能下降等问题.比如:例子1:图形应用中的图元等对象.字处理应用中的字符对象等. 2.解决方案: 享元模式(Flyweight):对象结构型模式运用

《JAVA与模式》之享元模式

Flyweight在拳击比赛中指最轻量级,即"蝇量级"或"雨量级",这里选择使用"享元模式"的意译,是因为这样更能反映模式的用意.享元模式是对象的结构模式.享元模式以共享的方式高效地支持大量的细粒度对象. Java中的String类型 在JAVA语言中,String类型就是使用了享元模式.String对象是final类型,对象一旦创建就不可改变.在JAVA中字符串常量都是存在常量池中的,JAVA会确保一个字符串常量在常量池中只有一个拷贝.Stri

NET设计模式 第二部分 结构性模式(12):享元模式(Flyweight Pattern)

享元模式(Flyweight Pattern) ——.NET设计模式系列之十三 Terrylee,2006年3月 摘要:面向对象的思想很好地解决了抽象性的问题,一般也不会出现性能上的问题.但是在某些情况下,对象的数量可能会太多,从而导致了运行时的代价.那么我们如何去避免大量细粒度的对象,同时又不影响客户程序使用面向对象的方式进行操作? 本文试图通过一个简单的字符处理的例子,运用重构的手段,一步步带你走进Flyweight模式,在这个过程中我们一同思考.探索.权衡,通过比较而得出好的实现方式,而不

设计模式C++实现二十二:享元模式

享元模式(flyweight):运用共享技术有效地支持大量细粒度的对象. 享元模式可以避免大量非常相似类的开销.在程序设计中,有时需要生成大量细粒度的类实例来表示数据.如果能发现这些实例除了几个参数外基本上都是相同的,有时就能够受大幅度地减少需要实例化的类的数量.如果能把那些参数移到类实例的外面,在方法调用时将它们传过来,就可以通过共享大幅度地减少单个实例的数目. 使用场景:如果一个应用程序使用了大量的对象,而大量的这些对象造成了很大的存储开销时就应该考虑应用,还有就是对象的大多数状态可以外部状

【编程思想】【设计模式】【结构模式Structural】享元模式flyweight

Python版 https://github.com/faif/python-patterns/blob/master/structural/flyweight.py #!/usr/bin/env python # -*- coding: utf-8 -*- """ *References: http://codesnipers.com/?q=python-flyweights *TL;DR80 Minimizes memory usage by sharing data w

&quot;围观&quot;设计模式(17)--结构型之享元模式(Flyweight Pattern)

享元模式(英语:Flyweight Pattern)是一种软件设计模式.它使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件:它适合用于当大量物件只是重复因而导致无法令人接受的使用大量内存.通常物件中的部分状态是可以分享.常见做法是把它们放在外部数据结构,当需要使用时再将它们传递给享元.----WIKIPEDIA 个人理解 共享,内存消耗大的时候应考虑对象的共享,共享对象可以减少对象的生成数量,这样可以减少内存的消耗,当一个对象和其他的对象存在共性且内容一致的时候,可以将共有

设计模式(十)享元模式Flyweight(结构型)

说明: 相对于其它模式,Flyweight模式在PHP实现似乎没有太大的意义,因为PHP的生命周期就在一个请求,请求执行完了,php占用的资源都被释放.我们只是为了学习而简单做了介绍. 1. 概述 面向对象技术可以很好地解决系统一些灵活性或可扩展性或抽象性的问题,但在很多情况下需要在系统中增加类和对象的个数.当对象数量太多时,将导致运行代价过高,带来性能下降等问题.比如:例子1:图形应用中的图元等对象.字处理应用中的字符对象等. 2.解决方案: 享元模式(Flyweight):对象结构型模式运用

设计模式(结构型)之享元模式(Flyweight Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(结构型)之外观模式(Facade Pattern)>http://blog.csdn.net/yanbober/article/details/45476527 概述 当一个软件系统在运行时产生的对象数量太多,将导致运行代价过高,带来系统性能下降等问题.所以需要采用一