1.单例模式1:
懒汉式:用到时再去构建对象,否则就不构建
应用场合:大对象(占用空间教大时),稀少用:
class PersonDemo01{
private static PersonDemo01 person;
private PersonDemo01(){}
/*int n[]=new int[10000];
//构建对象的时候存在,此时就不能用小对象来形容*/
public static PersonDemo01 getInstance() {
if (person==null) {
synchronized (PersonDemo01.class) {
if (person==null) {
person=new PersonDemo01();
}
}
}
return person;
}
}
2.单例模式2:
饿汉式:无论是否用到对象,都构建对象
应用场合:小对象,频繁用
class PersonDemo02{
//加载类就是将类读到内存(代码区)
private PersonDemo02(){}
private static PersonDemo02 person=new PersonDemo02();
//类加载时构建对象
public static PersonDemo02 getInstance() {
return person;
}
}
3.单例模式改进:内部类的写法:
class PersonDemo03{
private PersonDemo03(){}
static class Inner{
//静态内部类,相当于一个外部类,内部类的对象不依托于外部类对象而存在
public static PersonDemo03 person=new PersonDemo03();
}
public static PersonDemo03 getInstance() {
return Inner.person;
}
}
4.枚举:饿汉单例
enum PersonDemo04{
INSTANCE;//实例(类加载时创建)
public static void show(){}
public void display() {}
private PersonDemo04(){}//枚举类的构造方法默认是private的
}
5.线程内部单例:一个线程一份某个类的实例,借助ThreadLocal类实现
class PersonDemo05{
private PersonDemo05(){}
private static ThreadLocal<PersonDemo05> threadLocal=new ThreadLocal<>();
//底层是map
public static PersonDemo05 getInatance() {
//1.从当前线程获取实例
PersonDemo05 person=threadLocal.get();
//2.当前线程没有就创建实例
if (person==null) {
person=new PersonDemo05();
}
//3.创建实例后绑定到当前线程
threadLocal.set(person);//put(key,value)
return person;
}
}
这基本就是初学者用到的单例模式,写到这里小妞就先撤了