<?php
class Book{
public $title;
public $author; public function __construct($title,$author){
$this->author = $author;
$this->title = $title;
} public function getTitle(){
return $this->title;
} public function getAuthor(){
return $this->author;
}
} class BookFactory{
public $books; public function add($book){
$this->books[] = $book;
} public function getBook($title){
if(empty($this->books[$title])){//建立title和book的对应关系。
$this->books[$title] = new Book($title, '李白');
}
return $this->books[$title];
}
} class BookShelf{
public $shelf; public function add($book){
$this->shelf[] = $book;
} public function show(){
foreach ($this->shelf as $value){
echo '作者 :'.$value->getAuthor().' 标题:'.$value->getTitle();
echo "<br/>";
}
}
} class Client{
public static function main(){
$obj = new BookFactory();
$shelf = new BookShelf(); $book_1 = $obj->getBook('静夜思');
$book_2 = $obj->getBook('望天门山');
$book_3 = $obj->getBook('望庐山瀑布');
$book_4 = $obj->getBook('静夜思');//book4 服用的book1. if($book_1 === $book_4){
echo 'book1 is as the same as book4';
} $shelf->add($book_1);
$shelf->add($book_2);
$shelf->add($book_3); $shelf->show(); }
} Client::main();
?>

  UML类图如下:

补充一个实例:

<?php
//一个产品有ISBN号和名字
class Product{
public $ISBN;
public $name;
} //享元类,提取出共性,同一个ISBN号对应的名字不会变,把这本书名字提取出来,放入享元对象,这样享元对象就存储了内蕴状态,外蕴状态是ISBN号码 class Book{
public $name;
public function __construct($name){
$this->name = $name;
}
public function show(){
echo $this->name;
} } //享元对象生产工厂,传入外蕴对象,返回对应的享元对象。
class BookFactory{
public $books = array();
public function getBook($ISBN,$name){//维护一个对象池
if(!isset($this->books[$ISBN])){
$this->books[$ISBN] = new Book($name);
}
return $this->books[$ISBN];
}
} $obj = new BookFactory();
$book = $obj->getBook('1111','PHP高级程序设计');
$book2 = $obj->getBook('1111','');
$book2->show();
?>

  

php 实现设计模式之 享元模式的更多相关文章

  1. 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern)

    原文:乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) 作者:weba ...

  2. python设计模式之享元模式

    python设计模式之享元模式 由于对象创建的开销,面向对象的系统可能会面临性能问题.性能问题通常在资源受限的嵌入式系统中出现,比如智能手机和平板电脑.大型复杂系统中也可能会出现同样的问题,因为要在其 ...

  3. 【GOF23设计模式】享元模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_享元模式.享元池.内部状态.外部状态.线程池.连接池 package com.test.flyweight; /** * ...

  4. 设计模式之享元模式(Flyweight)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  5. Head First设计模式之享元模式(蝇量模式)

    一.定义 享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能.这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式. ...

  6. 【Unity3D与23种设计模式】享元模式(Flyweight)

    GoF中定义: "使用共享的方式,让一大群小规模对象能更有效地运行" 享元模式一般应用在游戏角色属性设置上 游戏策划需要通过"公式计算"或者"实际测试 ...

  7. Java进阶篇设计模式之七 ----- 享元模式和代理模式

    前言 在上一篇中我们学习了结构型模式的组合模式和过滤器模式.本篇则来学习下结构型模式最后的两个模式, 享元模式和代理模式. 享元模式 简介 享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能 ...

  8. Java设计模式之七 ----- 享元模式和代理模式

    前言 在上一篇中我们学习了结构型模式的组合模式和过滤器模式.本篇则来学习下结构型模式最后的两个模式, 享元模式和代理模式. 享元模式 简介 享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能 ...

  9. 【设计模式】享元模式(Flyweight)

    摘要: 1.本文将详细介绍享元模式的原理和实际代码中特别是Android系统代码中的应用. 纲要: 1. 引入享元模式 2. 享元模式的概念及优缺点介绍 3. 享元模式在Android源码中的应用 1 ...

  10. 设计模式之享元模式(PHP实现)

    github地址:https://github.com/ZQCard/design_pattern /** * 减少创建对象的数量,以减少内存占用和提高性能.这种类型的设计模式属于结构型模式, * 它 ...

随机推荐

  1. JavaScript学习笔记之数值

    JavaScript内部,所有数字都是以64位浮点数形式储存,即使整数也是如此.(整数也是通过64浮点数的形式来存储的) 所以,1+1.0=2:且1===1.0的 浮点数不是精确的值,所以涉及小数的比 ...

  2. DLL导出函数和类的定义区别 __declspec(dllexport)

    DLL导出函数和类的定义区别 __declspec(dllexport) 是有区别的, 请看 : //定义头文件的使用方,是导出还是导入 #if defined(_DLL_API) #ifndef D ...

  3. PHP面向对象

    面向对象 1.类由众多的对象抽象出来的    2.对象    一起皆对象    由类实例化出来的 求两个圆之间阴影的面积 $sr1=10; $sr2=5; $mj=3.14*$sr1*$sr1-3.1 ...

  4. HTML5_02之视频、音频、Canvas

    1.HTML5新特性之视频播放--video: ①例:<video src=""></video> ②video标签默认为300*150的inline-bl ...

  5. Java基础-服务器的发送和接收

    package hanqi.test; import java.io.IOException; import java.io.OutputStream; import java.io.PrintWri ...

  6. Linq语法详细

    闲言碎语 近期比较忙,但还是想写点什么,就分享一些基础的知识给大家看吧,希望能帮助一些linq新手,如果有其它疑问,可以进右上角群,进行交流探讨,谢谢. 开门见山 读这篇文章之前,我先说下,每一种搜索 ...

  7. 轻量级前端MVVM框架avalon - 控制器

    引子: 最近工作挺忙,avalon只能断断续续的写下去了,大概看了下angular的源码,看到小一半就比较难坚持了,是块硬骨头,慢慢啃吧 不过angular的的文档中用词还是很优雅: HTML编译器 ...

  8. OpenCascade Eigenvalues and Eigenvectors of Square Matrix

    OpenCascade Eigenvalues and Eigenvectors of Square Matrix eryar@163.com Abstract. OpenCascade use th ...

  9. .Net 转战 Android 4.4 日常笔记(2)--HelloWorld入门程序

    我不知道人们为什么那么喜欢用HelloWorld来做为自己的第一个程序入门,为什么不是hello **其他的东西或者hi. 一.打开ADT 的Eclipse开发工具新建一个Android项目 New- ...

  10. Mac下有道笔记本问题反馈

    1).Mac笔记上的编辑状态框非常的小.操作起来不是非常的方便.可以把显示稍微放大一些. 2). 新建笔记本的时候,这里用户可能没有注意到这里可以输入,此时这里的高亮的颜色可以适当的修改成别的颜色. ...