PHP设计模式(三)
注册器模式
这种模式比较简单好理解,在PHP框架中会经常用到,在某些比较大的PHP框架中,会在初始化时将一些常用的类实例放在注册器中,实际是存在注册器类中的一个静态数组中,以后想去用它的话,直接根据名称就可以获取到注册器中保存的实例。而不需要再次去new这个类、getInstance或者工厂方法获得。我感觉这种模式有点像是把单例模式和简单工厂模式结合起来了,实例化之后保存在一个静态数组中(类似单例模式的静态变量),然后可以根据不同的参数去获取注册过的实例,这里跟简单工厂模式相比较的话,他可以动态的添加实例进去,而不需要去修改代码,但这里要注意的就是必须先注册才可以获取。
这个模式要注意几个要点:
1. 首先就是要一个管理要注册的实例的类(例如:Register),我们就加他注册类吧。
2. 这个注册类必须有一个静态数组变量,采用键值数组(哈希)方式存储这些注册的实例,其中键对应实例名,值对应实例。
3. 当然了,_set、_get、_unset(采用下划线开始仅仅是因为unset是关键字,然后为了统一,就都加上了)这些方法都不能少,用来设置、获取、和销毁注册器中的内容。
4. 其实这个注册类可以看做是一个装载和卸载的过程,使用前进行装载,当这个实例不在使用时就可以卸载了。
4. 这里还需要注意,不能放太多的实例进去,有些实例用一次就可以销毁掉了就不用保存到注册器中,免得浪费空间。
5. 注册器中不同的名称是可以保存相同的实例的,因为他保存时是有名称作为索引。
<?php
/**
* 注册器模式——例子
* @author 燕睿涛(luluyrt@163.com)
*/
class Register{
/**
* @var array $objects
* 用来保存注册过的实例的变量
*/
private static $_objects = array(); /**
* 注册一个实例到注册器中
* @param string $name 要注册的类名
* @param object $obj 要注册的类实例
* @return true
*/
public static function _set($name,$obj){
if(!isset(self::$_objects[$name])){
self::$_objects[$name] = $obj;
}
return true;
} /**
* 从注册器中解除一个实例
* @param string $name 要注册的类名
* @return true
*/
public static function _unset($name){
if(isset(self::$_objects[$name])){
unset(self::$_objects[$name]);
}
return true;
} /**
* 从注册器中获取一个实例
* @param string $name 要注册的类名
* @return object/false
*/
public static function _get($name){
if(isset(self::$_objects[$name])){
return self::$_objects[$name];
}
return false;
}
} class Man{
public function say(){
echo "My name is Users!!";
}
} Register::_set('man1',new Man());
Register::_get('man1')->say();
PHP设计模式(三)的更多相关文章
- 8.4 GOF设计模式三: 外观模式 Facade
GOF设计模式三: 外观模式 Facade “现有系统”功能强大.复杂,开发“新系统”需要用到其中一部分,但又要增加一部 分新功能,该怎么办?4.1 Facade Pattern: Key Fea ...
- 从ES6重新认识JavaScript设计模式(三): 建造者模式
1 什么是建造者模式? 建造者模式(Builder)是将一个复杂对象的构建层与其表示层相互分离,同样的构建过程可采用不同的表示. 建造者模式的特点是分步构建一个复杂的对象,可以用不同组合或顺序建造出不 ...
- PHP设计模式三:原型设计模式
一.什么是原型设计模式 原型设计模式使用一种克隆技术来复制实例化的对象,新对象是通过复制原型实例创建的.原型设计模式的目的是通过使用克隆以减少 实例化对象的开销. 在原型设计模式中,Client类是不 ...
- java设计模式---三种工厂模式之间的区别
简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式.其主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性. 本文是本人对这三种模式学习后的一个小结以及对他 ...
- Java之美[从菜鸟到高手演变]之设计模式三
本章是关于设计模式的最后一讲,会讲到第三种设计模式--行为型模式,共11种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模 ...
- java设计模式三种工厂模式简单介绍
一.简单工厂模式 概述:简单工厂模式的创建意图就是,把对类的创建初始化全都交给一个工厂来执行,而用户不需要去关心创建的过程是什么样的,只用告诉工厂我想要什么就行了.而这种方法的缺点也很明显,违背了设计 ...
- 一、JSP九大内置对象 二、JAVAEE三层架构和MVC设计模式 三、Ajax
一.JSP九大内置对象###<1>概念 不需要预先申明和定义,可以直接在jsp代码中直接使用 在JSP转换成Servlet之后,九大对象在Servlet中的service方法中对其进行定义 ...
- 设计模式(三):“花瓶+鲜花”中的装饰者模式(Decorator Pattern)
在前两篇博客中详细的介绍了"策略模式"和“观察者模式”,今天我们就通过花瓶与鲜花的例子来类比一下“装饰模式”(Decorator Pattern).在“装饰模式”中很好的提现了开放 ...
- Java经典23结构模型的设计模式(三)------附加代理模式、适配器型号、Facade模式的差异
本文介绍了7样的结构模型中的其余2种:轻量级.代理模式. 一.享元模式FlyWeight 享元模式比較简单且重要,在非常多场合都被用到.仅仅只是封装起来了用户看不到.其概念:运用共享内存技术最大限度的 ...
- Php设计模式(三):行为型模式part2
原文详见:http://www.ucai.cn/blogdetail/7023?mid=1&f=5 可以在线运行查看效果哦! <接上文> 5.中介者模式(Mediator) : 用 ...
随机推荐
- SHGetFileInfo函数详解
SHGetFileInfo函数: WINSHELLAPI DWORD WINAPI SHGetFileInfo( LPCTSTR pszPath, DWORD dwFileAttributes, SH ...
- windows命令行下简单使用javac、java、javap详细演示
最近重新复习了一下java基础,在使用javap的过程中遇到了一些问题,这里便讲讲对于一个类文件如何编译.运行.反编译的.也让自己加深一下印象. 如题,首先我们在桌面,开始->运行->键入 ...
- oracle:如何用sql生成日历
BI分析中,经常需要将事实表与时间维度表关联起来,按年/月/日来逐层展示,常用的做法是创建一张日历表,结构类似如下: create table T_BAS_CALENDAR ( d_year ) no ...
- Spring Security笔记:使用数据库进行用户认证(form login using database)
在前一节,学习了如何自定义登录页,但是用户名.密码仍然是配置在xml中的,这样显然太非主流,本节将学习如何把用户名/密码/角色存储在db中,通过db来实现用户认证 一.项目结构 与前面的示例相比,因为 ...
- ejb3: message drive bean(MDB)示例
上一篇已经知道了JMS的基本操作,今天来看一下ejb3中的一种重要bean:Message Drive Bean(mdb) 如果要不断监听一个队列中的消息,通常我们需要写一个监听程序,这需要一定的开发 ...
- Android几种打开SQLite的方法
第一种:用SQLiteOpenHelper辅助类 SQLiteOpenHelper类可以用来创建或打开数据库,两个关键的方法:onCreate(SQLiteDatabase db)和onUpgrade ...
- java多态实现原理
众所周知,多态是面向对象编程语言的重要特性,它允许基类的指针或引用指向派生类的对象,而在具体访问时实现方法的动态绑定.C++ 和 Java 作为当前最为流行的两种面向对象编程语言,其内部对于多态的支持 ...
- Sharepoint 杂记
在Sharepoint中复制Settle.html,粘贴后改名为km.html,修改km.html会自动更新km.master,修改好模板后需要在站点发布. 添加List添加WebPart,继承KmW ...
- 各组对final发布产品的排名
结果 排名 组名 项目简称 组长 平均 方差 1 新蜂 俄罗斯 武志远 2 0.80 2 天天向上 连连看 王森 2.50 1.90 3 奋斗吧兄弟 食物链 黄兴 2.83 0.97 4 金洲勇士 考 ...
- iOS开发,音效的播放简单实现以及音效播放的简单封装
一.音效的播放简单实现 二.音效播放的封装 -- 封装思路:将生成的SystemSoundID存放到字典中,每次播放的时候从字典中取出对应的SystemSoundID,没有的话再创建 头文件中定义类方 ...