单例模式
核心:构造器私有
缺陷:不安全,建议才用枚举进行
饿汉单例
举例:ErrorContext和LogFactory
缺点:易造成资源浪费
class HungryMan{
private HungryMan(){}
private final static HungryMan hungryMan=new HungryMan();
public static HungryMan getInstance(){
return hungryMan;
}
}
懒汉单例(DCL)
class LazyMan{
private LazyMan(){}
//colatile 实现原子性操作
private volatile static LazyMan lazyMan=null;
//双重检测锁
public static LazyMan getInstance(){
if(lazyMan==null){
synchronized(LazyMan.class){
if(lazyMan==null){
lazyMan=new LazyMan();
}
}
}
}
return lazyMan;
}
原子性操作(是不需要synchronized):所谓原子操作是指不会被线程调度机制打断
的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何
context switch (切换到另一个线程)
原子性操作的过程:(这属于底层,不能理解可前往学习JUC)
1.分配内存空间
2.执行构造方法,初始化对象
3.将对象指向这个空间
若不是原子性操作可能会执行的顺序为132等情况,从而产生指令重排的问题
静态内部类
感觉没啥作用
class A{
private A(){}
public static getInstance(){
return InnerClass.a;
}
public static Class InnerClass{
private static final A a=new A();
}
}
枚举
解决单例模式不安全的问题
单例模式易被反射破解
public Enum EnumSingle(){
INSTANCE;
public EnumSingle getInstance(){
return INSTANCE;
}
}
工厂模式
实现创建者和调用者的分离
举例:sqlsessionFactory
本质:实例化对象不用new,用工厂代替
实现类和创建对象统一管理和控制,从而将调用者和实现类的耦合度降低
分类:
1.简单工厂模式(使用较多)
2.工厂方法模式
3.抽象工厂模式
需要为满足oop七大原则
1.简单工厂模式(使用较多):
缺点:增加新的产品必须修改代码(不满足开闭原则)
2.工厂方法模式:
缺点:每建立一个产品都需要建立一个工厂
本文章在学习狂神说的单例模式后整理(B站搜索狂神说)同时参考了百度百科等网络资源