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 注册器读写类
<?php
class
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
);
}
}
test.php 需要注册的类
<?php
class
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();
?>