常见设计模式之单例模式
单例模式_PHP语言描述
懒汉式(并发时会有缺陷)
class MediaPlayer{
// 1,懒汉式(需要的时候才实例化) 存在并发的问题
private static $obj;
// 2,构造函数私有化
private function __construct(){}
// 3,克隆方法也要私有化
private function __clone() {}
// 4,给外界提供一个静态接口
public static function shareInstance(){
// 如果不存在, 才要初始化
if( !self::$obj ){
self::$obj = new self();
// 也可以这样写
// self::$obj=new MediaPlayer();
}
// 检验方法$p1===$p2 比较内存地址
return self::$obj;
}
}
$s1 = MediaPlayer::shareInstance();
$s2 = MediaPlayer::shareInstance();
var_dump($s1);
var_dump($s1 === $s2);
var_dump($s2);
单例模式_JavaScript语法描述
// 定义类
let MediaPlayer = function() {
}
// 利用闭包的特性创建单例,同时符合惰性单例的特性
MediaPlayer.shareInstance = (function() {
let instance
return function(){
if (!instance) {
instance = new MediaPlayer()
}
}
})()
var player_1 = MediaPlayer.shareInstance()
var player_2 = MediaPlayer.shareInstance()
NSLog(player_1 === player_2)
效果如下:
单例模式_Objective-C语言描述
// 单例模式
+ (MediaPlayer *)shareInstance
{
static MediaPlayer *player = nil ;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
if (player == nil) {
player = [[MediaPlayer alloc] init];
}
});
return player;
}
单例模式_Java语法描述
第1种: 饿汉式(一上来就生成实例对象,线程安全,开发中常用,推荐)
class MediaPlayer {
prviate static MediaPlayer player = new MediaPlayer();
// 构造方法私有化
private MeidaPlayer(){};
// 提供统一访问入口
public static final MediaPlayer shareInstance(){
return player;
}
}
第2种: 懒汉式(延迟加载,遇到多线程会出问题)
class MediaPlayer {
private static MediaPlayer player = null;
private Media(){};
public static MediaPlayer shareInstance(){
if(player == null){
// 这儿有安全隐患
player = new MediaPlayer();
}
return player;
}
}
懒汉式的解决办法之一是:
在shareInstance()方法上面 加同步 关键字 synchronized