单例模式,一个类只被实例化一次。
类中用静态属性和静态方法去判断唯一性,要注意clone的问题。
Java中还要注意多线程同时实例化对象的坑,Php基本不存在这个问题,就不予考虑了。不过可以通过以下两个方案解决:
1. 急切创建实例。静态属性直接赋值单例对象,这样类调用时已经存在了对象。
2. 锁机制。实例化对象时加锁,完成后解锁。多线程中不会出现生成两个对象的坑了。
上代码:
<?php
interface People{
public function create();
}
class Factory{
private static $instance = null;
public static function getInstance() {
if (!self::$instance) {
self::$instance = new Factory();
}
return self::$instance;
}
public function __clone() {
// 注意,复制对象完成后会在这里改变属性值,解决对象属性浅复制问题
// 拒绝复制不要直接return false,而是抛出错误,或者改方法public属性为private
trigger_error('Clone is not allowed !');
}
}
$factory = Factory::getInstance();