三种基础设计模式(所有面向对象设计模式中最常见的三种):

① 工厂模式:使用工厂方法或者类生成对象,而不是在代码中直接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)基础设计模式:工厂模式、单例模式和注册树模式的更多相关文章

  1. PHP设计模式笔记三:三种基本设计模式(工厂模式、单例模式、注册树模式) -- Rango韩老师 http://www.imooc.com/learn/236

    一.工厂设计模式 index.php $db = IMooc\Factory::createDatabase(); 使用工厂类的静态方法直接创建一个dababase对象,当类名发生修改时,在工厂里修改 ...

  2. php基础设计模式 注册树模式、工厂模式、单列模式

    废话不多说了,先给大家介绍注册树模式然后介绍工厂模式最后给大家介绍单列模式,本文写的很详细,一起来学习吧. php注册树模式 什么是注册树模式? 注册树模式当然也叫注册模式,注册器模式.之所以我在这里 ...

  3. php设计模式 工厂、单例、注册树模式

    Source Code Pro字体  easyphp 命名空间:隔离类和函数,php5.3以后 //test5.php<?php namespace Test5;//命名空间必须是程序脚本的第一 ...

  4. Yii2设计模式——注册树模式

    应用举例 在Yii.php中: <?php class ServiceLocator extends Component { //保存实例化的对象,每个对象都是单例,且有唯一string类型的I ...

  5. 2018/04/24 PHP 设计模式之注册树模式

    之前学习了工厂模式和单例模式,明白了他们的意义. 但是我们在之后的使用中会发现一个问题,在新建一个实例的时候还是需要调用一个单例或者工厂,之后还是造成了代码和耦合和不好处理. 下面开始说一下: -- ...

  6. php设计模式之注册树模式

    什么是注册树模式?[全局共享和交换对象] 注册树模式当然也叫注册模式,注册器模式.注册树模式通过将对象实例注册到一棵全局的对象树上,需要的时候从对象树上采摘的模式设计方法.   这让我想起了小时候买糖 ...

  7. PHP——大话PHP设计模式——基本设计模式(工厂模式、单例模式、注册器模式)

  8. PHP设计模式_注册树模式

    通过注册树模式可以更加简单快捷的获取对象,在某个地方实例化了一个对象,可以将这个对象“保存”起来(放入可以全局使用的数组里),用的时候只需要提供 保存对象的时候 的那个标识即可,解决全局共享和交换对象 ...

  9. php设计模式-注册树模式

    php注册树模式 1.什么是注册树模式? 注册树模式通过将对象实例注册到全局对象树上,需要的时候将对象从全局对象树上取下来,就像小时候买糖葫芦一样,卖糖葫芦的将糖葫芦插在一个大的杆子上,人们买的时候就 ...

随机推荐

  1. C++类的成员函数使用的一些小总结

    From: http://blog.csdn.net/xiayefanxing/article/details/7607506 这一阵做项目代码开发的时候,用到了在一个C++文件中使用另一个类的成员函 ...

  2. 修改iptables防火墙规则解决vsftp登录后不显示文件目录的问题

    如果设置防火墙开端口可能只是常用的几个端口,这样很可能导vsftpd在被动模式时无法启动随机端口,从而造成客户端的FTP无法列出目录这样胡问题.解决方式很简单,给 vsftpd增加随机端口范围,然后把 ...

  3. CRC-16/XMODE X16+X12+X5+1 C#、C和java环境下实现

    private byte[] CRC(byte[] x, int len) //CRC校验函数 { ]; UInt16 crc = ; byte da; ; UInt16[] yu = { 0x000 ...

  4. 属性动画PropertyAnimation

    xml实现 <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="h ...

  5. thinkphp 目录

    WWW\User\Home\Conf\settings.php 1. APP_PATH . 'Home/Conf/settings.php 2.dirname( APP_PATH ) . '/User ...

  6. 关于Scala JDK与IDEA版本兼容的问题

    文章来自:http://www.cnblogs.com/hark0623/p/4174652.html  转发请注明 我刚装上Scala和IDEA时发现运行代码后总是出现 xxx is already ...

  7. hdu 1228

    Description 读入两个小于100的正整数A和B,计算A+B. 需要注意的是:A和B的每一位数字由对应的英文单词给出.    Input 测试输入包含若干测试用例,每个测试用例占一行,格式为& ...

  8. nodeAPI--TCP

    Node HTTP服务器是构建与Node TCP服务器之上的,即http.Server继承自net.Server; TCP特性: 面向连接的通信和保证顺序的传递: IP的协议是面向无连接,且数据包送达 ...

  9. Ajax过程

    http://www.cnblogs.com/daicunya/p/6227550.html 1.创建XMLHttpRequest对象,也就是创建一个异步调用对象. 2.创建一个新的HTTP请求,并指 ...

  10. 贪心 URAL 1303 Minimal Coverage

    题目传送门 /* 题意:最少需要多少条线段能覆盖[0, m]的长度 贪心:首先忽略被其他线段完全覆盖的线段,因为选取更长的更优 接着就是从p=0开始,以p点为标志,选取 (node[i].l < ...