PHP设计模式:单例模式
单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
实现单例模式所要考虑的问题:
- 01
问题1:只能有一个实例,new是罪恶的根源,想办法让外部不能new如何解决? 解决方法:通过将构造方法,保护或私有化,外部即不能生成实例了。
- 02
问题2:不能new了,那不成0例模式了吗?那总得想办法生成一个实例吧? 解决方法:既然在外部不能new了,内部可以new啊,所以决定在内部通过静态方法new一个实例。
- 03
问题3:现在有实例了,但外部每次调用静态方法生成实例,都不是一个对象。 如何防止呢? 解决方法:在内部将这个实例保存下来,并做判断。
- 04
问题4:如果继承一下,通过子类new对象,每次生成的都不是同一个对象了,如何解决? 解决方法:利用关键字“final“修饰生成实例的方法即可。
- 05
问题5:在外部通过clone函数克隆一个对象,此对象又发生了变化,如何解决? 解决方法:利用__clone魔术方法 解决此问题。
参考代码
- 01
<?php class single{ static public $object = null; protected function __construct(){ } final static function NewOb(){ if (self::$object instanceof self) { return self::$object; } self::$object = new self(); return self::$object; } public function __clone(){ echo "想克隆没门<br />"; } } $t1 = single::NewOb(); $t2 = single::NewOb(); $t3 = clone $t2; if ($t1 === $t2) { echo '是一个对象<br />'; }else { echo '不是一个对象<br />'; } if ($t3 === $t2) { echo '是一个对象<br />'; }else { echo '不是一个对象<br />'; } ?>