单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
适用性:
① 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时;
② 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。
例子:
class User
{
private $name;//声明一个私有的实例变量
static private $_instance = null;
final private function __construct(){//声明私有构造方法,防止外界实例化对象,使用final关键,防止继承后修改访问权限
}
final private function __clone(){//私有克隆方法,防止外部克隆对象,使用final关键,防止继承后修改访问权限
}
//静态方法,单例统一访问入口
static public function getInterface()
{
if(self::$_instance instanceof self)
{
return self::$_instance;
}
self::$_instance = new self();
return self::$_instance;
}
public function setName($n)
{
$this->name =$n;
}
public function getName()
{
return $this->name;
}
}
$na = User::getInterface();
$nb = User::getInterface();
$na->setName('张三');
echo $nb->getName();//张三
$nb->setName('李四');
echo $nb->getName();//李四
所有的单例模式至少拥有以下三种公共元素:
1、它们拥有一个私有的构造函数和克隆方法;
2、它们拥有一个保存类的实例的静态成员变量;
3、它们拥有一个访问这个实例的公共的静态方法。
单例类不能在其它类中直接实例化,只能被其自身实例化。它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。
单例模式的优点:
1、改进系统的设计;
2、是对全局变量的一种改进。
缺点:
1、难于调试;
2、隐藏的依赖关系;
3、无法用错误类型的数据覆写一个单例。
...
小结:
1、单例模式是只有一个对象实例的设计模式,所以不能被实例化(实例化时会自动调用构造函数)多次。通过private或protected来设置访问权限。
2、由于设置访问权限,无法通过new方法来实例化对象,只能通过内部实例化来创建对象实例,所以在入口方法使用static将入口方法设置为静态方法。