一、设计模式的分类
key | value |
创建型(五种) | ① 单例、② 抽象工厂、③ 原型、④ 建造者、⑤ 工厂 |
结构型(七种) | ① 适配器、② 桥接、③ 装饰、④ 组合、⑤ 外观、⑥ 享元、⑦ 代理 |
行为型(十一种) | 模板方法、命令、访问者、迭代器、观察者、中介者、备忘录、解释器、状态、策略、责任链 |
☃️ 创建型:强调在程序中创建对象时如何设计
☃️ 结构型:强调如何保证软件结构的扩展性和更合理的结构性
☃️ 行为型:强调如何提高方法的重用性,以及如何合理地抽取可复用的代码
二、介绍单例
☃️ Singleton Pattern:如果一个类被设计成单例设计模式,则在整个应用程序运行过程中,该类只能存在一个实例
☃️ 优点:节省系统资源(避免哪些创建开销大,且相同的对象被多次创建)
☃️ MyBatis 中的 SqlSessionFactory 的实现类(SqlSessionManager
)就是单例设计模式
MyBatis 中的单例设计模式:
/** * @author Larry Meadors */ public class SqlSessionManager implements SqlSessionFactory, SqlSession { private final SqlSessionFactory sqlSessionFactory; // 构造方法私有化 private SqlSessionManager(SqlSessionFactory sqlSessionFactory) { } public static SqlSessionManager newInstance(Reader reader) { return new SqlSessionManager(new SqlSessionFactoryBuilder().build(reader, null, null)); } public static SqlSessionManager newInstance(Reader reader, String environment) { return new SqlSessionManager(new SqlSessionFactoryBuilder().build(reader, environment, null)); } public static SqlSessionManager newInstance(SqlSessionFactory sqlSessionFactory) { return new SqlSessionManager(sqlSessionFactory); } }
三、饿汉式(静态常量)☆
🍎 类变量在程序运行过程中只占用一份固定的内存(存储在方法区)
/** * 单例模式饿汉式(静态变量) */ public class Singleton1 { // static final 常量在程序运行过程中只有一份固定的内存 // 静态变量在类加载的时候被初始化(不存在多线程的情况) // 且类仅被加载一次 private static final Singleton1 INSTANCE = new Singleton1(); /** * 构造方法私有化 */ private Singleton1() { System.out.println("1 private Singleton1()"); } /** * 返回 JVM 内存中 Singleton1 的唯一实例 */ public static Singleton1 getInstance() { System.out.println("2 public static Singleton1 getInstance()"); return INSTANCE; } }
🍎 线程安全
🍎 无法实现懒加载,会有内存浪费情况出现
四、饿汉式(静态代码块)
/** * 单例模式饿汉式(静态代码块) */ public class Singleton2 { private static final Singleton2 INSTANCE; // 静态初始化块, 当类第一次被使用的时候会执行一次静态初始化块里面的代码 static { System.out.println("1 static{}"); INSTANCE = new Singleton2(); } private Singleton2() { System.out.println("2 private Singleton2()"); } public static Singleton2 getInstance() { return INSTANCE; } }
🍎 线程安全
🍎 无法实现懒加载,会有内存浪费情况出现
五、懒汉式(线程不安全)
/** * 单例设计模式懒汉式(线程不安全) */ public class Singleton3 { private static Singleton3 instance; private Singleton3() { } public static Singleton3 getInstance() { if (instance == null) { // 懒加载(线程不安全) instance = new Singleton3(); } return instance; } }
六、懒汉式(同步方法 - 线程安全)
/** * 单例设计模式懒汉式(同步方法 - 线程安全) */ public class Singleton4 { private static Singleton4 instance; private Singleton4() { } /** * 加锁(synchronized): 线程安全 */ public static synchronized Singleton4 getInstance() { if (instance == null) { instance = new Singleton4(); } return instance; } }
📝 优点:懒加载(不消耗内存且线程安全)
📝 缺点:加锁🔒导致性能降低
七、单例模式双层检查 ☆☆☆
/** * 单例模式双重检查 */ public class Singleton5 { private static volatile Singleton5 instance; private Singleton5() { } public static Singleton5 getInstance() { if (instance == null) { synchronized (Singleton5.class) { if (instance == null) { instance = new Singleton5(); } } } return instance; } }
八、单例模式(静态内部类)☆☆☆☆☆
/** * 单例模式静态内部类 */ public class Singleton6 { private Singleton6() { } private static class Singleton6Holder { private static final Singleton6 INSTANCE = new Singleton6(); } public Singleton6 getInstance() { return Singleton6Holder.INSTANCE; } }
九、单例模式 - 枚举
/** * 单例模式 - 枚举 */ public enum SingletonEnum { INSTANCE }