konakona
php和java的单例模式介绍和实践
php和java的单例模式介绍和实践

今天在研究各种模式,一个一个记录……

打个简单的比喻,中国史上一般只有一个皇帝,这就需要单例模式了。

首先是php的实现:

class king{
	//保存自身对象
	private static $self;
	//私有的构造方法,保证这个类不会被new实例化
	private function king(){}
	//通过这个静态方法来实例化自身,并返回对象
	public static function getInstance(){
		if(self::$self == null){
			return self::$self = new king();
		}else{
			return self::$king;
		}
	}

	public function say(){
		echo 'yo!man!';
	}
}

$king = king::getInstance();
$king->say();

然后是java的实现:

public class King{
	private static King k = null;
	private King(){}
	public static King getInstance(){
		if(k = null){
			k = new King();
		}
		return k;
	}

	public void say(){
		System.out.println("oh!shit!man!");
	}
}

public static void main(String args[]){
	public King k = null;
	k = King.getInstance();
	k.say();
}

他们都有两个共同点:
1。构造函数私有化
2。通过getInstance()方法来实例化自身

这里有一问题,假如同时有2个线程在进行请求,就有可能造成业务逻辑混乱(if判断不正确),java就必须修改为:

public class King{
	private static final King k = null;
	private King(){}
	public synchronized static King getInstance(){
		if(k = null){
			k = new King();
		}
		return k;
	}

	public void say(){
		System.out.println("oh!shit!man!");
	}
}

public static void main(String args[]){
	public King k = null;
	k = King.getInstance();
	k.say();
}

注意到了吗?
对象声明为final,getInstance()方法采用了同步synchronized声明。
就可以彻底解决这个问题。

因php不是多线程的,所以不存在同时请求造成业务逻辑混乱的问题。

赞赏
https://secure.gravatar.com/avatar/3b712b34a0e1b689cfb524c9c6bcdc47?s=256&r=g

团哥

文章作者

继续玩我的CODE,让别人说去。 低调,就是这么自信。

发表评论

textsms
account_circle
email

konakona

php和java的单例模式介绍和实践
今天在研究各种模式,一个一个记录…… 打个简单的比喻,中国史上一般只有一个皇帝,这就需要单例模式了。 首先是php的实现: class king{ //保存自身对象 private static $se…
扫描二维码继续阅读
2012-06-07