<?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. 为CentOS7(文字界面操作)系统安装gnome图形界面程序

    1.安装gnome sudo yum groupinstall "GNOME Desktop" "Graphical Administration Tools" ...

  2. failed to load the jni shared library jvm

    启动eclipse luna时候出现的, 原因在于,eclipse要求jdk是 32位的, 而我本机安装的是 64的!

  3. spring快速入门(一)

    对于为什么使用spring框架,这里不多做解释,详情请百度.本人推荐面向驱动程序学习,通过实战来瞧瞧spring技术的伟大.所以先来看看原始开发一个简单的例子,由例子引入spring相关的技术.如果错 ...

  4. HTTP学习一:HTTP基础知识

    1 HTTP介绍 HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议. 它的发展是万维网协会(World Wid ...

  5. Android开发-之数据的存储方式一

    在Android中,数据的存储分为两种方式: 1.直接以文件的形式存储在目录中 2.以json格式存储在数据库中 将数据以文件的存储又分为两种方式: 1.生成.txt文件 2.生成xml文件 那么今天 ...

  6. html5多出来的字自动隐藏并显示...

  7. ExtJs4之Grid详细

    ExtJs博客前奏 由于这段时间事情比较杂乱,博客就主要以项目中例子来说明编写. ExtJs4中的Grid非常强大,有展示,选中,搜索,排序,编辑,拖拽等基本功能,这篇博客我就这几个功能做写累述. 1 ...

  8. OpenCascade Draw Test Harness

    OpenCascade Draw Test Harness eryar@163.com Abstract. Draw is a command interpreter based on Tcl/Tk ...

  9. Form authentication(表单认证)问题

    前言 最近在做ASP.NET MVC中表单认证时出了一些问题,特此记录. 问题 进行表单认证时,在 PostAuthenticateRequest 事件中从Cookie值中解密票据.如下: prote ...

  10. JavaScript阻塞剖析与改善

    一.阻塞特性 <高性能JavaScript>一书中,关于第一章“Loading and Execution”,提到了无阻塞加载JavaScript技术,目的是为了提高页面呈现速度. 说到无 ...