PHP 设计模式 笔记与总结(6)基础设计模式:工厂模式、单例模式和注册树模式
三种基础设计模式(所有面向对象设计模式中最常见的三种):
① 工厂模式:使用工厂方法或者类生成对象,而不是在代码中直接new
在 Common 目录下新建 Factory.php:
<?php
namespace Common; class Factory{
static function createDatabase(){
//$db = new \Common\Database;
$db = new Database;
return $db;
}
}
index.php:
<?php
define('BASEDIR',__DIR__); //定义根目录常量
include BASEDIR.'/Common/Loader.php';
spl_autoload_register('\\Common\\Loader::autoload'); $db = Common\Factory::createDatabase();
var_dump($db);
页面输出:
object(Common\Database)[1]
工厂模式相较直接 new 一个对象的好处是:如果没有使用工厂模式,在 php 很多文件中都 new 了Database 这个类,当 Database 类发生了改变,例如名称或者参数发生了变化,那么要在每一个 new 了 Database 类的文件中逐一进行修改;而使用了工厂模式之后,只需要需改工厂方法中把类的名称或者参数进行修改即可。
② 单例模式:使某个类的对象仅允许创建一个
Common/Database.php:
<?php
namespace Common; class Database{
//声明保护或者私有的属性
protected static $db;
//声明私有的构造函数
private function __construct() { }
//声明静态的获取实例的函数,在这个函数中实例化自己
static function getInstance(){
if(self::$db){
return self::$db;
}else{ //数据库的连接从来没有创建过
self::$db = new self();
return self::$db;
}
}
}
index.php:
<?php
define('BASEDIR',__DIR__); //定义根目录常量
include BASEDIR.'/Common/Loader.php';
spl_autoload_register('\\Common\\Loader::autoload'); //获取数据库的实例,无论调用多少次,都只创建一次 Database 对象,到数据库只有一个连接
$db = Common\Database::getInstance();
修改工厂方法 Common/Factory.php:
<?php
namespace Common; class Factory{
static function createDatabase(){
$db = Database::getInstance();
return $db;
}
}
工厂 + 单例
③ 注册模式(注册器模式):用来解决全局共享和交换对象
注册模式就是将一些对象注册到全局树上面,那么可以被任何地方直接访问
在 Common 目录下创建 Register.php:
<?php
namespace Common; class Register{
protected static $objects;
//将一个对象注册到全局的注册树上
static function set($alias, $object){ //$alias:映射的名字
//当调用set方法时,将对象映射到注册树上
self::$objects[$alias] = $object;
} //得到全局树上的对象
static function get($name){
return self::$objects[$name];
} function _unset($alias){
//调用unset方法时,表示把对象从树上移除
unset(self::$objects[$alias]);
}
}
修改 Factory.php:
<?php
namespace Common; class Factory{
static function createDatabase(){
$db = Database::getInstance();
//得到数据库对象后,将该对象映射到全局树上
Register::set('db1',$db);//db1为映射的别名
return $db;
}
}
入口文件 index.php:
<?php
define('BASEDIR',__DIR__); //定义根目录常量
include BASEDIR.'/Common/Loader.php';
spl_autoload_register('\\Common\\Loader::autoload'); //获取数据库的实例,无论调用多少次,都只创建一次 Database 对象,到数据库只有一个连接
$db = Common\Factory::createDatabase();
var_dump($db); $db2 = Common\Register::get('db1');
var_dump($db2); Common\Register::_unset('db1');
$db2 = Common\Register::get('db1');
var_dump($db2);
运行,页面输出:
object(Common\Database)[1]
object(Common\Database)[1] Notice: Undefined index: db1 in D:\practise\php\design\psr0\Common\Register.php on line 14null
PHP 设计模式 笔记与总结(6)基础设计模式:工厂模式、单例模式和注册树模式的更多相关文章
- PHP设计模式笔记三:三种基本设计模式(工厂模式、单例模式、注册树模式) -- Rango韩老师 http://www.imooc.com/learn/236
一.工厂设计模式 index.php $db = IMooc\Factory::createDatabase(); 使用工厂类的静态方法直接创建一个dababase对象,当类名发生修改时,在工厂里修改 ...
- php基础设计模式 注册树模式、工厂模式、单列模式
废话不多说了,先给大家介绍注册树模式然后介绍工厂模式最后给大家介绍单列模式,本文写的很详细,一起来学习吧. php注册树模式 什么是注册树模式? 注册树模式当然也叫注册模式,注册器模式.之所以我在这里 ...
- php设计模式 工厂、单例、注册树模式
Source Code Pro字体 easyphp 命名空间:隔离类和函数,php5.3以后 //test5.php<?php namespace Test5;//命名空间必须是程序脚本的第一 ...
- Yii2设计模式——注册树模式
应用举例 在Yii.php中: <?php class ServiceLocator extends Component { //保存实例化的对象,每个对象都是单例,且有唯一string类型的I ...
- 2018/04/24 PHP 设计模式之注册树模式
之前学习了工厂模式和单例模式,明白了他们的意义. 但是我们在之后的使用中会发现一个问题,在新建一个实例的时候还是需要调用一个单例或者工厂,之后还是造成了代码和耦合和不好处理. 下面开始说一下: -- ...
- php设计模式之注册树模式
什么是注册树模式?[全局共享和交换对象] 注册树模式当然也叫注册模式,注册器模式.注册树模式通过将对象实例注册到一棵全局的对象树上,需要的时候从对象树上采摘的模式设计方法. 这让我想起了小时候买糖 ...
- PHP——大话PHP设计模式——基本设计模式(工厂模式、单例模式、注册器模式)
- PHP设计模式_注册树模式
通过注册树模式可以更加简单快捷的获取对象,在某个地方实例化了一个对象,可以将这个对象“保存”起来(放入可以全局使用的数组里),用的时候只需要提供 保存对象的时候 的那个标识即可,解决全局共享和交换对象 ...
- php设计模式-注册树模式
php注册树模式 1.什么是注册树模式? 注册树模式通过将对象实例注册到全局对象树上,需要的时候将对象从全局对象树上取下来,就像小时候买糖葫芦一样,卖糖葫芦的将糖葫芦插在一个大的杆子上,人们买的时候就 ...
随机推荐
- ASP.Net核心对象之HttpResponse
简介: HttpResponse是对响应报文进行设置的一个对象.通过context. Response 能够得到HttpResponse对象. context.Response.Charset;//获 ...
- jdk
mkdir java mv jdk1.7.0_71/ java/ [root@centos02 src]# java -version java version "1.7.0_71" ...
- unix PS命令和JPS命令的区别
1.JPS介绍 用来查看基于HotSpot的JVM里面中,所有具有访问权限的Java进程的具体状态, 包括进程ID,进程启动的路径及启动参数等等,与unix上的ps类似,只不过jps是用来显示java ...
- MakeFile中赋值
Makefile 中:= ?= += =的区别 在Makefile中我们经常看到 = := ?= +=这几个赋值运算符,那么他们有什么区别呢?我们来做个简单的实验 新建一个Makefile,内容为 ...
- HTML 调用iscroll.js主要事项
iscroll是一款很不错的滚动控件(js),但是在调用的时候,需要注意一些事项: 1.iscroll支持水平和垂直滚动,那么在调用的时候,一定注意滚动div必须大于父div,也就是说,父div的宽度 ...
- 被忽视但很实用的那部分SQL
一.前言 虽然我们大多数人都学习过SQL,但是经常忽略它.总是会自以为学到的已经足够用了,从而导致我们在实际开发的过程中遇到复杂的问题后只能在检索数据后通过传统的代码来完成,但是其中很多的功能利用SQ ...
- hdu 4024 二分
转自:http://www.cnblogs.com/kuangbin/archive/2012/08/23/2653003.html 一种是直接根据公式计算的,另外一种是二分算出来的.两种方法速度 ...
- 在getView方法产生给用户item的视图以及数据
在getView方法产生给用户item的视图以及数据
- Android开发中Bundle用法包裹数据(转)
Android开发中Bundle用法包裹数据 Bundle的经典用法,包裹数据放入Intent中,目的在于传输数据. SDK 里是这样描述: A mapping from String values ...
- Burpsuite教程与技巧之HTTP brute暴力破解
Burpsuite教程与技巧之HTTP brute暴力破解 Gall @ WEB安全 2013-02-28 共 19052 人围观,发现 32 个不明物体收藏该文 感谢Gall投递 常规的对usern ...