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