文章目录
关于创建型设计模式在源码中的应用的笔记
笔记1:设计模式 笔记1 | 五个创建型模式 | Java 语言实现 | 工厂方法设计模式 | 抽象工厂模式 |建造者模式 | 单例模式 | 原型模式_程序喵 尤Ni的博客-CSDN博客
一、创建型设计模式 知识回顾
创建型设计模式 主要有五种,分别是:
- 工厂方法设计模式
- 抽象工厂模式
- 建造者模式
- 单例模式
- 原型模式
接下来用简要的一句话概括这些设计模式的定义和主要组成部分:
1.1 工厂方法设计模式
定义:提供符合开闭原则的工厂对象,支持获取同一类型的产品。
特点:工厂和产品都有抽象和具体实现两种。
主要组成:
1.2 抽象工厂模式
定义:为访问类提供一组相关的接口,支持获取多种类型的产品。
特点:工厂方法的升级版,符合开闭原则。
主要组成:
1.3 建造者模式
定义:将创建对象的过程根据其属性分成多个步骤,每一个步骤支持单独处理部分的属性。
特点:可以和工厂方法模式结合使用,封装性好
主要组成:
其中抽象建造者和具体建造者可以合并,直接放在产品角色中,即静态内部类的方式实现建造者模式,这种方式比较常用,其组成图如下:
1.4 单例模式
定义:只有一个单例对象,通常使用 static 关键字实现
特点:分为懒汉式 和 饿汉式两种,前者在多线程环境下需要用到 synchronized 同步,防止多线程抢占资源
主要组成:只有一个单例对象,贴一个不使用 synchronized ,而用 Java类加载机制完美实现懒汉式的代码:
public class Singleton {
private Singleton(){
} // 私有化无参构造
private static class Holder{
// 静态内部类
// 根据类加载特性, 仅使用Singleton类时,不会对静态内部类进行初始化
private final static Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance(){
return Holder.INSTANCE; // 直接获取内部类的静态实例
}
}
1.5 原型模式
定义:用已创建的对象实例作为原型,通过复制该原型对象来创建一个和原型相同货类似的新对象。
特点:分为浅克隆和深克隆两种,Object类的clone() 属于 浅克隆,比直接new快
主要组成:
二、创建型设计模式在源码中的应用总结
2.1 工厂方法模式 logback
参考笔记:https://blog.csdn.net/Unirithe/article/details/125911608
logback** **是一种日志管理框架,由 log4j (流行的日志管理框架)创始人推出,是 log4j 的升级版,同时也是 SpringBoot 默认的日志管理框架
日志级别分类以及优先级为:ERROR > WARN > INFO > DEBUG >TRACE
logback 架构:
- logback-core,框架代码核心,其他两个模块依赖此模块
- logback-classic,log4j优化版本,实现了原生log4j
- logback-access,可集成到现有的Servlet容器,如Tomcat、Jetty(按需引入)
主要的三个接口:
- Logger,属于 logback-classic 模块,最常用的接口,用于获取日志对象
- Appender 和 Layout 接口,属于 logback-core 模块
使用到工厂模式的类:LoggerFactory.java
public final class LoggerFactory {
private LoggerFactory() {
} // 构造方法私有化
public static Logger getLogger(Class<?> clazz) {
...
}
}
LoggerFactory 是 logback-classic 提供的 日志工厂类,我们一般是通过这个工厂里的方法来获取日志对象 Logger 的。
getLogger 是 日志工厂提供的静态方法,是重载的方法,最常见的有 String 和 Class两个参数:
public static Logger getLogger(Class<?> clazz) {
// 获取字节码的名称,调用重载方法获取 Logger
Logger logger = getLogger(clazz.getName());
...
return logger;
}
public static Logger getLogger(String name) {
// 获取工厂实现类
ILoggerFactory iLoggerFactory = getILoggerFactory();
return iLoggerFactory.getLogger(name);
}
public static ILoggerFactory getILoggerFactory() {
...}
通过源码可以看出,getLogger 是日志工厂里可以获取日志的方法,,其本质吊用了日志工厂对应的抽象工厂,即 iLoggerFactory 接口的 getLogger方法。
2.2 抽象工厂模式 Spring
参考笔记:
Spring 是 Java EE 编程领域的一个轻量级开源框架,集成了各类型的工具,通过核心的 BeanFactory 实现了底层的类的实例化和生命周期的管理
Spring特点:IOC 控制反转,DI 依赖注入,AOP 面向切面编程
Spring中的抽象工厂模式:
BeanFactory 接口声明了一系列关于获取 Bean 的方法:
package org.springframework.beans.factory;
import org.springframework.beans.BeansException;
import org.springframework.core.ResolvableType;
import org.springframework.lang.Nullable;
public interface BeanFactory {
// Bean 自带的前缀
String FACTORY_BEAN_PREFIX = "&";
// 1. 根据名称获取 Bean
Object getBean(String name) throws BeansException;
// 2. 根据名称获取 Bean, 并转化为指定的对象
<T> T getBean(String name, Class<T> requiredType) throws BeansException;
// 3. 根据名称获取 Bean, 并传入构造该Bean的参数,用于有参构造
Object getBean(String name, Object... args)