单例模式

单例模式按字面来看就是某一个类只有一个实例,这样做的好处还是很大的,比如说数据库的连接,我们只需要实例化一次,不需要每次都去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也是可以的。不定义为公有,是为了防止直接访问这个静态实例,因为直接访问这个对象的时候,它有可能还没有初始化。所以,在单例模式中,我们通常提供一个获取这个静态实例的方法,而这个方法的第一步就是检测这个实例是不是已经初始化过,如果没有初始化就先初始化,然后再是返回这个静态实例。

原文地址:https://www.cnblogs.com/zhuiluoyu/p/5266690.html