单例模式
1.介绍
单例模式适用于一些特殊的类的创建,比如管理类、工厂类等;这些类的共同之处在于,他们仅需要一个对象即可完成所有相关工作,额外创建的对象也许没什么意义。但在实际的使用中,可能会为了方便,直接创建一个新对象,那么这是时候就需要通过一些代码手段将这个新对象转变为程序一开始就决定提供的那个对象
2.一些实现手段
私有化类的构造方法
使得在其他类中创建该类对象时,无法使用new 操作符,而只能通过类的getInstance()方法。再对getInstance()方法进行重写,使其返回目标类中已经确定了的一个对象。
@一般手段
此对象可以设定为公共静态常量,其不可改变,但是可以提供操作,比如工厂类的对象使用;这个常量在类加载时便初始化,或者使用静态语句块,两者效果是一样的
【优点,简单且适用,线程安全;缺点:一旦类加载就会被创建实例】
//normal
public staic final Manager INSTANCE = new Manger();
privat Manager(){}
//static block
public static final Manager INSTANCE ;
static {
INSTANCE = new Manager();
}
@懒汉构造方法
lazy loading:在getInstance()中创建对象
【优点:避免一般手段中的类加载创建】
【缺点:可能线程不安全】
public static final Manager INSTANE;
private Manager(){}
public static Manager getInstance(){
if(INSTANCS == null)
INSTANCE = new Maneger();
return INSTANCE;
}
//解决办法 加锁 --新的问题,效率,时间,资源
public static synchronized Manager getInstance(){}
java lambda表达式:仅适用于只包含一个函数的内部类对象快速创建
@新的问题–加锁又提速
加锁的进步->双重校验 ,volatile
//其实这种还需要考虑指令重排
private static volatile Manager INSTANCE;//JIT
public static Manager getInstance(){
if(INSTANCE == null){
synchronized (Manager.class){
if(INSTANCE == null)
INSTANCE == new Manager();
}
}
return INSTANCE;
}
@完美-静态内部类写法
如何实现:在单例的类F中写一个静态内部类holder,然后在holder中声明静态常量INSTANCE并赋值,然后在F的getInstance()中获取holder的INSTANCE即可。
private static class Holder{
private final static Manager INSTANCE = new Manager();
}
public static Manager getIntance(){
return Holder.INSTANCE;
}
原理:一个静态内部类,在外部类被加载的时候不会被加载,故而holder在getInstance()调用时被加载;线程安全由JVM保证。
@极致完美
使用enum,线程安全,且可反序列化
public enum Manager{
INSTANCE;
public static void main(String[] args){
//调用方式
System.out.println(Manager.INSTANCE);
}
}
以上就是单例模式的简单内容啦,有不对的地方可以评论区或者私信我进行纠正哦~