享元模式很好的实例

参考资料:  http://www.jb51.net/article/27473.htm
<?php
/**
 * 享元模式
 *
 * 运用享元技术有效的支持大量细粒度的对象
 */
class CD
{
    private $_title = null;
    private $_artist = null;
    public function setTitle($title)
    {
        $this->_title = $title;
    }
    public function getTitle()
    {
        return $this->_title;
    }
    public function setArtist($artist)
    {
        $this->_artist = $artist;
        echo ‘打印参数传来的实例:‘.serialize($artist).‘<br>‘;
    }
    public function getArtist($artist)
    {
        return $this->_artist;
    }
}

class Artist
{
    private $_name;
    public function __construct($name)
    {
        echo "正在实例化:".$name."<br/>";
        $this->_name = $name;
    }
    public function getName()
    {
        return $this->_name;
    }
}

class ArtistFactory
{
    private $_artists = array();
    public function getArtist($name)
    {
        if(isset($this->_artists[$name]))//传过来的参数已经被实例化了,就返回参数对应的实例
        {
            return $this->_artists[$name];
        }
        else
        {
            $objArtist = new Artist($name);//实例化一个对象
            $this->_artists[$name] = $objArtist;//这个主要记录传过来的参数已经被实例化
            return $objArtist;//返回实例
        }
    }
}

//这里享元模式的研究对象是Artist类
$objArtistFactory = new ArtistFactory();
$objCD1 = new CD();
$objCD1->setTitle("title1");
$objCD1->setArtist($objArtistFactory->getArtist(‘artist1‘));
$objCD2 = new CD();
$objCD2->setTitle("title2");
$objCD2->setArtist($objArtistFactory->getArtist(‘artist2‘));
$objCD3 = new CD();
$objCD3->setTitle("title3");
$objCD3->setArtist($objArtistFactory->getArtist(‘artist1‘));//这个artist1对象已经存在,所以“正在实例化”那句不会输出
 
时间: 2024-08-28 03:18:41

享元模式很好的实例的相关文章

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

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

js设计模式之享元模式

享元模式(具有共性的实例对象,归并到一个类别中,避免重复创建相同实例对象) var candidateNum = 10 // 考生数量 var examCarNum = 0 // 驾考车的数量 /* 驾考车构造函数 */ function ExamCar(carType) { examCarNum++ this.carId = examCarNum this.carType = carType ? '手动档' : '自动档' } ExamCar.prototype.examine = funct

Java设计模式之享元模式实例详解

本文实例讲述了Java设计模式之享元模式.分享给大家供大家参考,具体如下: 解释一下概念:也就是说在一个系统中如果有多个相同的对象,那么只共享一份就可以了,不必每个都去实例化一个对象.比如说一个文本系统,每个字母定一个对象,那么大小写字母一共就是52个,那么就要定义52个对象.如果有一个1M的文本,那么字母是何其的多,如果每个字母都定义一个对象那么内存早就爆了.那么如果要是每个字母都共享一个对象,那么就大大节约了资源. 在Flyweight模式中,由于要产生各种各样的对象,所以在Flyweigh

23种设计模式之享元模式代码实例

享元模式的主要目的是实现对象的共享,在Java的各种池技术中用得比较多, 如线程池,数据库连接池等.当一个客户端请求时,工厂需要检查当前对象池中是否有符合条件的对象,如果有,就返回已经存在的对象,如果没有,则创建一个新对象. 这样可以节约内存. 数据库连接池: public class ConnectionPool { private Vector<Connection> pool; /*公有属性*/ private String url = "jdbc:mysql://localh

享元模式(结构型)

思考问题:设计一个围棋游戏,模拟一个下棋动作,如何设计? 解答:很直接的,我们会设计一个棋盘类Chessboard,一个棋子类Chesspiece,每下一枚棋子时就new一个棋子对象(传入颜色.位置),然后将这些棋子装入到一个容器中. 这种简单粗暴的方式确实是解决了问题,但你会发现,棋子永远只有黑白色,棋子对象的函数都是一样的, 主要的变化只是(x,y)位置而已,那能不能单独把(x,y)独立出来让调用者管理(而非记录到棋子内部),让棋子对象变成一个可重用的对象呢?这样就可以避免产生大量棋子对象了

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

<?php /**  * 2.6 享元模式  *   定义:  *       运用共享技术有效地支持大量细粒度的对象.  *   角色:  *       1. 抽象享元(Flyweight)类  *           职责:所有具体享元类的超类或接口,  *                 通过这个接口,享元类可以接  *                 受并作用于外部状态.  *       2. 具体享元类  *           职责:继承享元抽象类,并为内部状态  *      

设计模式-享元模式

***********************************************声明****************************************************** 原创作品,出自 "晓风残月xj" 博客,欢迎转载,转载时请务必注明出处(http://blog.csdn.net/xiaofengcanyuexj). 由于各种原因,可能存在诸多不足,欢迎斧正! *******************************************

java/android 设计模式学习笔记(13)---享元模式

这篇我们来介绍一下享元模式(Flyweight Pattern),Flyweight 代表轻量级的意思,享元模式是对象池的一种实现.享元模式用来尽可能减少内存使用量,它适合用于可能存在大量重复对象的场景,缓存可共享的对象,来达到对象共享和避免创建过多对象的效果,这样一来就可以提升性能,避免内存移除和频繁 GC 等. 享元模式的一个经典使用案例是文本系统中图形显示所用的数据结构,一个文本系统能够显示的字符种类就是那么几十上百个,那么就定义这么些基础字符对象,存储每个字符的显示外形和其他的格式化数据

【转】享元模式——实现对象的复用

[作者:刘伟  http://blog.csdn.net/lovelion] 当前咱们国家正在大力倡导构建和谐社会,其中一个很重要的组成部分就是建设资源节约型社会,“浪费可耻,节俭光荣”.在软件系统中,有时候也会存在资源浪费的情况,例如在计算机内存中存储了多个完全相同或者非常相似的对象,如果这些对象的数量太多将导致系统运行代价过高,内存属于计算机的“稀缺资源”,不应该用来“随便浪费”,那么是否存在一种技术可以用于节约内存使用空间,实现对这些相同或者相似对象的共享访问呢?答案是肯定,这种技术就是我