PHP设计模式中最基础的三种设计模式,工厂模式、单例模式、注册树模式


1. 单例模式

通过提供对自身共享实例的访问, 单例设计模式用于限制特定对象只能被创建一次。单例设计模式最常用于构建数据库连接对象

不管调用多少次singleton方法,都只会new一次

<?php
class Singleton
{
    // 保存类实例在此属性中
    private static $instance;
    // 构造方法声明为private,防止直接创建对象
    private function __construct() 
    {
        echo 'I am constructed';
    }
    // singleton 方法
    public static function singleton() 
    {
        if (!isset(self::$instance)) {
            $c = __CLASS__;
            self::$instance = new $c;
        }
        return self::$instance;
    }
    // Example类中的普通方法
    public function bark()
    {
        echo 'Woof!';
    }
    // 阻止用户复制对象实例
    public function __clone()
    {
        trigger_error('Clone is not allowed.', E_USER_ERROR);
    }
}

?>

这样我们可以得到一个独一无二的Singleton类的对象。

<?php
// 这个写法会出错,因为构造方法被声明为private
$test = new Singleton;

// 下面将得到Example类的单例对象
$test = Singleton::singleton();
$test->bark();

// 复制对象将导致一个E_USER_ERROR.
$test_clone = clone $test;

?>
2. 工厂模式

工厂模式(Factory)允许你在代码执行时实例化对象。它之所以被称为工厂模式是因为它负责“生产”对象。工厂方法的参数是 你要生成的对象对应的类名称。

只需要new一次,如果new的对象名做了修改也只需要更改一个地方

<?php
class Example
{
    // The parameterized factory method
    public static function factory($type)
    {
        if (include_once 'Drivers/' . $type . '.php') {
            $classname = 'Driver_' . $type;
            return new $classname;
        } else {
            throw new Exception ('Driver not found');
        }
    }
}
?>

按上面的方式可以动态加载drivers。如果Example类是一个数据库抽象类,那么 可以这样来生成MySQL和 SQLite驱动对象:

<?php
// Load a MySQL Driver
$mysql = Example::factory('MySQL');
// Load a SQLite Driver
$sqlite = Example::factory('SQLite');
?>
3. 注册器模式

注册器模式也叫注册树模式,注册模式等

注册树模式通过将对象实例注册到一棵全局的对象树上,需要的时候从对象树上采摘的模式设计方法

<?php
/**
* 注册模式
*/
class Register{
    protected status $objects;
   
    static function set ($alias, $object)
    {
        self::$objects[$alias] = $object;
    }
    static function get($name)
    {
        return self::$objects[$name];
    }
    static function _unset($alias)
    {
            unset(self::$objects[$alias]);
    }
}

本文由 一切随风 创作,可自由转载、引用,但需署名作者且注明文章出处。

还不快抢沙发

添加新评论