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
}