单例模式可能是所有设计模式中最简单,但却是非常重要的一种设计模式。
很多情况下都需要类只有一个实例,比如说数据库的实例对象(可以看深空的那个数据库类。就是采用了单例模式)。因为他只有一个类图。所以说他简单。
通过几个提问,可能你能更容易的理解单例模式!
你如何创建类的实例?
使用new关键字
那如何避免一个类的实例创建?
可以这样操作么?
class MyObject{
private function __construct() {
}
}
那这样将如何获取这个类的实例?
因为构造函数已经被私有化。只有类的内部才能调用这个类的实例。外部想调用是没办法的。
那如果这样操作是不是就解决了?
class MyObject{
private function __construct() {
}
public function getInstance(){
return new MyObject;
}
}
直接外部调用getInstance()方法就能够返回这个类的实例。这样做的好处是保证整个应用程序中只有一个类的实例。当然。需要进一步的限制。为了保证这个类的实例是独一无二的。所以得在类的内部进行存储,判断。下面是标准的单例模式的例子
/**
* 单例模式实例
*/
class MyObject{
//提供一个私有的静态成员。他用来存储这个类在整个应用程序中的实例
static $obj;//并且没有声明是什么保护类型。子类也可以直接使用。
//下面这个变量是测试用的
private $test;
private function __construct(){
//可以在这里写入你构造这个类实例的时候初始化操作
$this->test="我将进行单例模式的操作";
}
//通常情况下的单利模式都是采用getInstance作为单例引用的方法名
public static function getInstance(){
//通过instanceof类型判断是否这个类的实例变量已经进行了初始化。此过程是保证整个类的实例是独一无二的
if(!(self::$obj instanceof self)){
self::$obj = new self();
}
return self::$obj;
}
//对__clone方法进行私有化是为了防止外部通过复制这个类的副本而形成不同的实例引用。
private function __clone(){}
public function test(){
echo $this->test;
}
}
$a= MyObject::getInstance();
$a->test();
self的用法,self代表了整个类的引用,而不是任何具体的实例引用。
类图我就不画了。挺简单的东西。就一个类。
作为单例模式。必须具有一下几个特征:
1、必须有一个显性的构造器,并且申明为私有的(private)
2、必须有一个静态成员(static mamber)来记录这个类的实例引用。
3、必须有一个公开的(public)方法来对这个类进行实例化调用
其他的注意项我已经在上面的例子中进行了著名。结果我就不贴了。自己运行尝试。
定义单例模式:
确保一个类只有一个实例,并提供全局访问点。
没什么需要交代的了。就这么多。赶紧去修改自己的数据库类吧!