PHP设计模式之工厂/单例/注册者模式
工厂模式
简单工厂模式 【静态工厂方法模式】(Static Factory Method)
是类的创建模式
工厂模式的几种形态:
1、简单工厂模式(Simple Factory)又叫做 静态工厂方法模式(Static Factory Method)
2、工厂方法模式(Factory Method)又叫做 多态性工厂模式(Polymorphic Factory)
3、抽象工厂模式(Abstract Factory)又叫做 工具箱模式(ToolKit)
创建工厂类
<?php
require_once ("test.php"); class Factory
{
public static function createObj()
{
$obj = new test();
return $obj;
}
}
调用工厂类中的静态方法创建对象
<?php
require_once ("Factory.php"); //$test = new test();
$test = Factory::createObj();
echo $test->name;
单例模式
创建类的唯一实例
test.php
<?php class test
{
private static $_instance = null;
private function __construct()
{
echo "create obj";
}
private function __clone()
{ }
public static function getInstance()
{
if (static::$_instance === null)
{
static::$_instance = new static; //使用static替代self,static关键字来访问静态的方法或者变量,与self不同,static的引用是由运行时决定,保证继承有效
}
return static::$_instance;
}
}
index.php
<?php
require_once ("test.php"); $obj = test::getInstance();
注册器模式
单例模式保证了一个类中只有一个实例被全局访问,当你有一组全局对象被全局访问时可能就需要用到注册者模式 (registry),它 提供了在程序中有条理的存放并管理对象 (object)一种解决方案。一个“注册模式”应该提供get() 和 set()方法来存储和取得对象(用一些属性key)而且也应该提供一个isValid()方法来确定一个给定的属 性是否已经设置。
注册模式通过单一的全局的对象来获取对其它对象的引用
register.php 注册器读写类
<?phpclass Registry extends ArrayObject{ private static $_instance = null; /** * 取得Registry实例 * * @note 单件模式 * * @return object */ public static function getInstance() { if (self::$_instance === null) { self::$_instance = new self(); echo "new register object!"; } return self::$_instance; } /** * 保存一项内容到注册表中 * * @param string $name 索引 * @param mixed $value 数据 * * @return void */ public static function set($name, $value) { self::getInstance()->offsetSet($name, $value); } /** * 取得注册表中某项内容的值 * * @param string $name 索引 * * @return mixed */ public static function get($name) { $instance = self::getInstance(); if (!$instance->offsetExists($name)) { return null; } return $instance->offsetGet($name); } /** * 检查一个索引是否存在 * * @param string $name 索引 * * @return boolean */ public static function isRegistered($name) { return self::getInstance()->offsetExists($name); } /** * 删除注册表中的指定项 * * @param string $name 索引 * * @return void */ public static function remove($name) { self::getInstance()->offsetUnset($name); }}
<?phpclass Test{ function hello() { echo "hello world"; return; }} ?>index.php 测试类
<?php//引入相关类require_once "Registry.class.php";require_once "test.class.php";//new a object$test=new Test();//$test->hello();//注册对象Registry::set('testclass',$test);//取出对象$t = Registry::get('testclass');//调用对象方法$t->hello();?>PHP设计模式之工厂/单例/注册者模式的更多相关文章
- Spring对单例的底层实现,单例注册表
Spring框架对单例的支持是采用单例注册表的方式进行实现的,源码如下: public abstract class AbstractBeanFactory implements Configurab ...
- Redis 单例、主从模式、sentinel 以及集群的配置方式及优缺点对比(转)
摘要: redis作为一种NoSql数据库,其提供了一种高效的缓存方案,本文则主要对其单例,主从模式,sentinel以及集群的配置方式进行说明,对比其优缺点,阐述redis作为一种缓存框架的高可用性 ...
- iOS开发——高级篇——iOS中常见的设计模式(MVC/单例/委托/观察者)
关于设计模式这个问题,在网上也找过一些资料,下面是我自己总结的,分享给大家 如果你刚接触设计模式,我们有好消息告诉你!首先,多亏了Cocoa的构建方式,你已经使用了许多的设计模式以及被鼓励的最佳实践. ...
- iOS中常见的设计模式(MVC/单例/委托/观察者)
关于设计模式这个问题,在网上也找过一些资料,下面是我自己总结的,分享给大家 如果你刚接触设计模式,我们有好消息告诉你!首先,多亏了Cocoa的构建方式,你已经使用了许多的设计模式以及被鼓励的最佳实践. ...
- iOS单例设计模式具体解说(单例设计模式不断完好的过程)
在iOS中有非常多的设计模式,有一本书<Elements of Reusable Object-Oriented Software>(中文名字为<设计模式>)讲述了23种软件设 ...
- 设计模式——通用泛型单例(普通型和继承自MonoBehaviour)
单例模式是设计模式中最为常见的,不多解释了.但应该尽量避免使用,一般全局管理类才使用单例. 普通泛型单例: public abstract class Singleton<T> where ...
- Java设计模式:Singleton(单例)模式
概念定义 Singleton(单例)模式是指在程序运行期间, 某些类只实例化一次,创建一个全局唯一对象.因此,单例类只能有一个实例,且必须自己创建自己的这个唯一实例,并对外提供访问该实例的方式. 单例 ...
- java23种设计模式之二: 单例设计模式(6种写法)
目的:在某些业务场景中,我们需要某个类的实例对象的只能有一个,因此我们需要创建一些单例对象. 本文共有6种写法,仅供参考 1.饿汉式 优点: 在多线程情况下,该方法创建的单例是线程安全的(立即加载) ...
- 【java设计模式】之 单例(Singleton)模式
1. 单例模式的定义 单例模式(Singleton Pattern)是一个比較简单的模式.其原始定义例如以下:Ensure a class has only one instance, and pro ...
随机推荐
- context-param和init-param区别
转载 http://www.cnblogs.com/hzj-/articles/1689836.html <context-param>的作用:web.xml的配置中<context ...
- 从a站点跳转到b站点,通过url的参数判断是否让该用户选择身份
一.问题的由来 问题是这样子给出来,今天产品那边跟我说,在a网站跳转到b网站时,让用户有一个选择身份的弹窗.因为公司有两个不同站点,你无论在a或者b网站注册后,都可以随便登录这两个站点,进入之后都会有 ...
- 利用PS脚本自动删除7天之前建立的目录-方法1!
目前有一个备份目录,目录名称为d:\temp\bak目录,在这目录下,根据备份要求,自动生成了如下目录的列表: 20131012 20131011 20131010 20131009 20131008 ...
- careercup-数学与概率 7.6
7.6 在二维平面上,有一些点,请找出经过点数最多的那条线. 解法: 类似于leetcode:Max Points on a Line 我们只需在任意两点之间“画”一条无限长的直线(也即不是线段),并 ...
- 【转】windows环境下利用doxygen生成代码文档
作者:jiangwenna http://www.jiangwenna.com/windows-doxygen-doc/ Doxygen是一种开源跨平台的,以类似JavaDoc风格描述的文档系统 ...
- JS问题Uncaught ReferenceError:XXXX is not defined
背景: html中一个table,table中进行分页.每行后面有一系列操作,如删除,修改.现在以删除为例说明问题. 实现方式: 使用button,在onclick中调用js函数,js函数中传递参数如 ...
- Docker container network configuration
http://xmodulo.com/networking-between-docker-containers.html How to set up networking between Docker ...
- redis resque消息队列
Resque 目前正在学习使用resque .resque-scheduler来发布异步任务和定时任务,为了方便以后查阅,所以记录一下. resque和resque-scheduler其优点在于功能比 ...
- 安卓百度地图开发so文件引用失败问题研究
博客: 安卓之家 微博: 追风917 CSDN: 蒋朋的家 简书: 追风917 博客园: 追风917 # 问题 首先,下面的问题基本都是在Android Studio下使用不当导致,eclipse是百 ...
- iOS 获取当前媒体音量
#import <AVFoundation/AVAudioSession.h> AVAudioSession *audioSession = [AVAudioSession sharedI ...