單例模式是咱們平常用到的頻率比較高的設計模式,常見有如下幾種類型:java
1 餓漢單例
2 懶漢單例
3 線程安全的懶漢單例
4 雙重校驗模式
5 靜態內部類模式設計模式
這篇文章主要介紹一下這幾種單例模式在Java以及Kotlin中的不一樣實現方式安全
//Java實現
public class SingletonDemo {
private static SingletonDemo instance=new SingletonDemo();
private SingletonDemo(){
}
public static SingletonDemo getInstance(){
return instance;
}
}
//Kotlin實現
object SingletonDemo
複製代碼
沒錯,kotlin中實現餓漢單例只須要在類名前面加上一個object關鍵字就能夠了。由於kotlin中是沒有靜態方法的概念的,因此就沒有辦法建立相似java實現方式中的getInstance()這樣的靜態方法。可是kotlin提供了更加簡潔的方式達到相同的效果,就是使用object關鍵字。、markdown
//Java實現
public class SingletonDemo {
private static SingletonDemo instance;
private SingletonDemo(){}
public static SingletonDemo getInstance(){
if(instance==null){
instance=new SingletonDemo();
}
return instance;
}
}
//Kotlin實現
class SingletonDemo private constructor() {
companion object {
private var instance: SingletonDemo? = null
//這裏使用的是自定義訪問器
get() {
if (field == null) {
field = SingletonDemo()
}
return field
}
fun get(): SingletonDemo{
return instance!!
}
}
}
複製代碼
kotlin實現懶漢單例的關鍵點有兩個:1 主構造器私有化 2 使用自定義訪問器返回對象實例this
//Java實現
public class SingletonDemo {
private static SingletonDemo instance;
private SingletonDemo(){}
//爲方法添加同步鎖
public static synchronized SingletonDemo getInstance(){
if(instance==null){
instance=new SingletonDemo();
}
return instance;
}
}
//Kotlin實現
class SingletonDemo private constructor() {
companion object {
private var instance: SingletonDemo? = null
get() {
if (field == null) {
field = SingletonDemo()
}
return field
}
//使用同步鎖註解
@Synchronized
fun get(): SingletonDemo{
return instance!!
}
}
}
複製代碼
內容基本與懶漢模式相同,惟一的區別就是Java使用爲方法添加同步鎖的方式實現,kotlin須要在方法中添加 @Synchronized註解。spa
//Java實現
public class SingletonDemo {
private volatile static SingletonDemo instance;
private SingletonDemo(){}
public static SingletonDemo getInstance(){
if(instance==null){
synchronized (SingletonDemo.class){
if(instance==null){
instance=new SingletonDemo();
}
}
}
return instance;
}
}
//kotlin實現
class SingletonDemo private constructor() {
companion object {
val instance: SingletonDemo by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {
SingletonDemo() }
}
}
複製代碼
Java中的雙重校驗鎖模式就是在同步鎖模式的基礎上稍做改動,添加了雙重判斷,而且將同步鎖的做用域進一步縮小到了方法內部進行第二重判斷以前。而kotlin中雙重校驗鎖的實現更加簡單,直接使用lazy結合屬性委託的方式實現。線程
//Java實現
public class SingletonDemo {
private static class SingletonHolder{
private static SingletonDemo instance=new SingletonDemo();
}
private SingletonDemo(){
System.out.println("this is a singleton model");
}
public static SingletonDemo getInstance(){
return SingletonHolder.instance;
}
}
//kotlin實現
class SingletonDemo private constructor() {
companion object {
val instance = SingletonHolder.holder
}
private object SingletonHolder {
val holder= SingletonDemo()
}
}
複製代碼
kotlin和java的實現方式基本相同設計