单例模式的三种写法

时间:2021-05-23 21:17:13
/**
* 饿汉式-我不管你用不用我都提前最备好
* 浪费内存
*
*/
public class Singleton {

//传参数没法做
private static Singleton instance = new Singleton();

private Singleton() {

}

public static Singleton getInstace() {
return instance;
}
}


/**
* 通常写法
*
* 懒汉式---当你使用的时候我就创建单例对象
*
* 一般的客户端开发经常使用的解决方案
*
*/
public class Singleton {

private static Singleton instance;

private Singleton() {

}

//在服务器,或者多线程访问
//服务器并发
public static synchronized Singleton getInstace() {
//假设:3个线程---并发线程
//场景:同时调用getInstace方法
//线程一:
if (instance == null) {
instance = new Singleton();
}
return instance;
}

}



/**
* 双重检查(折中考虑,既不浪费内存,性能相对来说也比较高)
*/
public class Singleton {

//线程并发时候,当我们的变量被被修改之后,其他的并发线程及时收到通知,其他的线程就可以访问数据
//volatile--会屏蔽虚拟机优化过程
private volatile static Singleton instance;

//iOS开发经常是这么搞的(基本上写单例都加索)
private Singleton() {
}

public static Singleton getInstace() {
if(instance == null){
synchronized (Singleton.class) {
if(instance == null){
instance = new Singleton();
}
}
}
return instance;
}

}

另外在Android中也可使用枚举:

//场景
//分析:聊天消息的Adapter是不是消息类型
//你包括:文本消息、图片消息、文件消息、语言消息、表情消息、视频
//2012年6月份
//枚举高级编程--高级用法
public class ChatMessageAdapter extends BaseAdapter {

// 枚举单例模式应用场景---经常遇到
enum ChatMessageType{
Text(R.layout.activity_main), Image(R.layout.activity_main), File(
R.layout.activity_main), Voice(R.layout.activity_main), Video(
R.layout.activity_main), Emoji(R.layout.activity_main);

private int layoutId;

private ChatMessageType(int layoutId) {
this.layoutId = layoutId;
}

public int getLayoutId() {
return layoutId;
}

public void close(){

}

}

@Override
public int getCount() {
return 0;
}

@Override
public Object getItem(int position) {
return null;
}

@Override
public long getItemId(int position) {
return 0;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
return null;
}

}

整理自代码