蒙国造博客

常见的PHP设计模式和实现

 

全部设计模式请看《PHP设计模式教程

 

不论是 PHP、Java还是C++编程语言,在编程的时候,我们所遇到的大部分问题,其实都已经被其他程序员一再的处理了。设计模式提取了共同问题,定义了经过测试的解决方案,并描述了可能的结果。也就是说,设计模式(Patterns)是一些可以在项目中重复使用的解决方案。但是,设计模式并非像组件那样,能被合并来构建系统的固定的解决方案,它们是解决一般性问题的通用方法。

1 工厂模式

工厂通常是一个用来创建其他对象的对象。对于某些需要大量实例化(new)的类,可以用另外一个类来专门管理其实例化过程,这样在使用的时候就不需要每次都用new来实例化,直接调用工厂类即可,避免代码的重复。而且,如果实例化过程需要调整,也不用每个地方都要修改。

PHP实例代码如下。

// 会大量使用到的 User 类
class User
{
    public function getUserName()
    {
        return 'Bob';
    }
}

// 创建用于实例化 User 的工厂类,使用一个静态方法返回实例化后的对象
class UserFactory
{
    public static function createUser()
    {
        return new User;
    }
}

// 这样就可以通过工厂类来实例化并使用 User 对象了
$user = UserFactory::createUser();
echo $user->getUserName();

抽象工厂模式、生成器模式和单例模式都会用到工厂模式的概念。

2 单例模式

单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。

再比如,通过数据库句柄到数据库的连接是独占的,所以在应用程序中就要共享数据库句柄,因为在保持连接打开或关闭时,它是一种开销。如下是代码示例。

class Database
{
    private static $db;

    private function __construct()
    {
    }
 
    static function getInstance()
    {
        if(!self::$db){
            self::$db = new self();
        }
 
        return self::$db;
    }
}

$db = Database::getInstance();  // 第一次使用,会创建对象
$db = Database::getInstance();  // 第二次使用,直接使用句柄对象
$db = Database::getInstance();  // 第三次或更多次,也是直接使用

代码中将构造函数 __construct() 可见性设置为私有,这样在应用中就无法 new 来创建对象,必须通过 Database 类中自带的 getInstance() 方法获取数据库句柄。如果句柄不存在,则创建句柄对象;如果已经存在,则直接返回。

 

 

 

参考资料

 

退出移动版