今天在研究各种模式,一个一个记录……
打个简单的比喻,中国史上一般只有一个皇帝,这就需要单例模式了。
首先是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不是多线程的,所以不存在同时请求造成业务逻辑混乱的问题。
发表回复