设计模式 笔记11 | 创建型设计模式在源码中的应用 总结篇(一)


关于创建型设计模式在源码中的应用的笔记

笔记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) 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值