全部设计模式请看《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()
方法获取数据库句柄。如果句柄不存在,则创建句柄对象;如果已经存在,则直接返回。
参考资料
- IBM – 五种常见的 PHP 设计模式
- PHP: The Right Way – Design Patterns
- Graphic Design Patterns – 创建型模式