单例模式

问题:
1. 应用程序不同部分之间需要通过某个类的唯一实例来共享一些数据。
2. 某个类需要保证其只有唯一实例。

实现:
1. 构造方法私有化,防止类外部实例化该类,从而出现多个实例对象。
2. 使用public静态方法和private静态属性来间接实例化对象。
代码示例:

class application
{
	private static $app;

	private function __construct()
	{
		//构造函数逻辑
	}

	public static function getInstance()
	{
		if(empty(self::$app)) {
			self::$app = new application();
		}
		return self::$app;
	}
}
//获得单例对象
$app = application::getInstance();

效果:
1. 可以通过单例对象在应用程序不同部分之间共享一些数据。
2. 保证唯一实例,不需要多次创建对象,传递对象。

 

单例类分类:
1. 饿汉式单例类:单例类在自己被加载时就将自己实例化(静态初始化)。

class application
{
	private static $app = new application();

	private function __construct()
	{
		//构造函数逻辑
	}

	public static function getInstance()
	{
		return self::$app;
	}
}

优点:无需考虑多线程访问的安全性问题。
缺点:需要提前占用系统资源。

2. 懒汉式单例类:单例类在自己第一次被引用时才会将自己实例化。
“代码示例”中的例子就是懒汉式单例类。
优点:需要使用单例类时才进行实例化,不至于提前占用系统资源。
缺点:需要考虑多线程访问的安全性问题。为了防止多线程访问时可能导致多个实例被创建,需要对单例实例化之处做双重锁定处理。示例如下:

public static function getInstance()
{
	if(empty(self::$app)) {
	 	if() {//锁定判断
			//加锁
			if(empty(self::$app)) {
				self::$app = new application();
			}
			//释放锁
	  	}
	}
    return self::$app;
}

 

  

 

  

 

posted @ 2018-09-10 17:31  疯一样的狼人  阅读(149)  评论(0编辑  收藏  举报