单例模式按字面来看就是某一个类只有一个实例,这样做的好处还是很大的,比如说数据库的连接,我们只需要实例化一次,不需要每次都去new了,这样极大的降低了资源的耗费。
单例类至少拥有以下三种公共元素:
必须拥有一个构造函数,并且必须被标记为private。
拥有一个保存类的实例的静态成员变量。
拥有一个访问这个实例的公共的静态方法
另外、需要创建__clone()方法防止对象被复制(克隆)
具体使用方面,我在下面php实例中注释的很清楚:
<?php class Mysql{ //该属性用来保存实例 private static $conn; //构造函数为private,防止创建对象 private function __construct(){ $this->conn = mysql_connect('localhost','root',''); } //创建一个用来实例化对象的方法 public static function getInstance(){ if(!(self::$conn instanceof self)){ self::$conn = new self; } return self::$conn; } //防止对象被复制 public function __clone(){ trigger_error('Clone is not allowed !'); } } //只能这样取得实例,不能new 和 clone $mysql = Mysql::getInstance(); ?>
单例实现方法:
/** * $_instance必须声明为静态的私有变量 * 构造函数和析构函数必须声明为私有,防止外部程序new * 类从而失去单例模式的意义 * getInstance()方法必须设置为公有的,必须调用此方法 * 以返回实例的一个引用 * ::操作符只能访问静态变量和静态函数 * new对象都会消耗内存 * 使用场景:最常用的地方是数据库连接。 * 使用单例模式生成一个对象后, * 该对象可以被其它众多对象所使用。 */ class InstanceDemo { //保存类实例的静态成员变量 private static $_instance; //private标记的构造方法 private function __construct(){ echo ´This is a Constructed method;´; } //创建__clone方法防止对象被复制克隆 public function __clone(){ trigger_error(´Clone is not allow!´,E_USER_ERROR); } //单例方法,用于访问实例的公共的静态方法 public static function getInstance(){ if(!(self::$_instance instanceof self)){ self::$_instance = new self; } return self::$_instance; } public function test(){ echo ´调用方法成功´; } }
调用方法:
//正确方法,用双冒号::操作符访问静态方法获取实例 $demo = InstanceDemo ::getInstance(); $demo->test();
php单例模式 保存实例的静态变量 为什么要私有?
其实你这里不应该问为什么要私有,应该问为什么不公有。其实定义为protected也是可以的。不定义为公有,是为了防止直接访问这个静态实例,因为直接访问这个对象的时候,它有可能还没有初始化。所以,在单例模式中,我们通常提供一个获取这个静态实例的方法,而这个方法的第一步就是检测这个实例是不是已经初始化过,如果没有初始化就先初始化,然后再是返回这个静态实例。