设计模式 简单工厂 工厂方法模式 抽象工厂模式 Spring 工厂 BeanFactory 解析

工厂模式介绍

工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。它是创建型模式。

简单工厂

简单工厂模式是指由一个工厂对象决定创建出哪一种产品类的实例, 但它不属于GOF 23种设计模式

简单工厂适用于工厂类负责创建的对象较少的场景, 且客户端只需要传入工厂类的参数, 对于如何创建对象的逻辑不需要关心

适用场景: 工厂类负责创建的对象较少 对于如何创建对象的逻辑不需要关心

优点: 只需要传入一个正确的参数 就可以获取所需要的对象 无需知道创建细节

缺点: 违背开闭原则 不易于扩展过于复杂的产品结构 新增产品需要修改工厂类的代码

以下我们用支付场景演示简单工厂用法

1.定义支付接口

/**
 * 支付接口
 *
 * @author Lion Li
 */
public interface IPay {
    void payment();
}

2.编写工厂实例

/**
 * 付款方式工厂
 *
 * @author Lion Li
 */
public class PayFactory {

    /**
     * 创建付款实例
     * Class<? extends IPay> 单一原则 限制必须是 IPay 的子类
     */
    public IPay create(Class<? extends IPay> clazz) {
        if (null != clazz) {
            try {
                return clazz.newInstance();
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
        return null;
    }

}

3.编写具体的支付类 例如: 微信 支付宝

/**
 * 微信支付
 *
 * @author Lion Li
 */
public class WxPay implements IPay {

    public void payment() {
        System.out.println("微信支付");
    }
}
/**
 * 支付宝支付
 *
 * @author Lion Li
 */
public class ZfbPay implements IPay {

    public void payment() {
        System.out.println("支付宝支付");
    }
}

4.编写测试类并运行测试

/**
 * @author Lion Li
 */
public class Test {

    public static void main(String[] args) {
        IPay wx = new PayFactory().create(WxPay.class);
        IPay zfb = new PayFactory().create(ZfbPay.class);
        wx.payment();
        zfb.payment();
    }
}

工厂方法模式

工厂方法模式是指定义一个创建对象的接口, 但让实现这个接口的类来觉得实例化哪个类, 工厂方法让类的实例化推迟到子类中进行

适用场景: 创建对象需要大量重复的代码 不依赖于产品类实例如何被创建 实现等细节

优点: 用户只需要关心所需要产品对应的工厂 无需关心创建细节 加入新产品符合开闭原则 提供了系统的可扩展性

缺点: 类的个数容易过多 增加的代码的结构负责都 增加了系统的抽象性和理解难度

以下我们用汽车场景工厂方法模式用法

1.定义汽车接口规范

/**
 * 汽车接口规范
 *
 * @author Lion Li
 */
public interface ICar {
    void name();
}

2.编写汽车工厂接口规范

/**
 * 汽车工厂接口规范
 *
 * @author Lion Li
 */
public interface ICarFactory {
    ICar create();
}

3.编写具体的汽车种类 例如: 宝马 大众

/**
 * 宝马汽车
 *
 * @author Lion Li
 */
public class BaoMaCar implements ICar {

    public void name() {
        System.out.println("我是宝马");
    }
}
/**
 * 大众汽车
 *
 * @author Lion Li
 */
public class DaZhongCar implements ICar {

    public void name() {
        System.out.println("我是大众");
    }
}

4.编写具体的汽车工厂 例如: 宝马工厂 大众工厂

/**
 * 宝马汽车工厂
 *
 * @author Lion Li
 */
public class BaoMaCarFactory implements ICarFactory {

    public ICar create() {
        return new BaoMaCar();
    }
}
/**
 * 大众汽车工厂
 *
 * @author Lion Li
 */
public class DaZhongCarFactory implements ICarFactory {

    public ICar create() {
        return new DaZhongCar();
    }
}

5.编写测试类并运行测试

/**
 * @author Lion Li
 */
public class Test {

    public static void main(String[] args){
        ICarFactory baomaFactory = new BaoMaCarFactory();
        ICar baoma = baomaFactory.create();
        baoma.name();
        ICarFactory dazhongFactory = new DaZhongCarFactory();
        ICar dazhong = dazhongFactory.create();
        dazhong.name();
    }

}

抽象工厂

抽象工厂模式是指提供一个创建一系列相关或相互依赖对象的接口 无需指定他们具体的类

适用场景:

  1. 不依赖于产品类实例如何被创建等细节 强调一系列相关产品对象一起使用创建对象需要大量重复的代码
  2. 提供一个产品类的库 所有产品以同样的接口出现 从而不依赖于具体的实现

优点: 具体产品在应用层代码隔离 无需关心创建细节 将一个系列的产品统一到一起创建

缺点: 规定了所有可能被创建的产品集合 产品中扩展新产品困难 需要修改抽象工厂的接口 增加了系统的理解难度和抽象性

以下我们用多种出行方式来演示抽象工厂用法

1.定义产品接口规范

/**
 * 汽车接口规范
 *
 * @author Lion Li
 */
public interface ICar {
    void name();
}
/**
 * 飞机接口规范
 *
 * @author Lion Li
 */
public interface IAircraft {

    void name();
}

2.定义产品工厂接口规范

/**
 * 汽车工厂接口规范
 *
 * @author Lion Li
 */
public interface ICarFactory {
    ICar create();
}
/**
 * 飞机工厂接口规范
 *
 * @author Lion Li
 */
public interface IAircraftFactory {
    IAircraft create();
}

3.定义所有产品实现

/**
 * 宝马汽车
 *
 * @author Lion Li
 */
public class BaoMaCar implements ICar {
    public void name() {
        System.out.println("我是宝马");
    }
}
/**
 * 大众汽车
 *
 * @author Lion Li
 */
public class DaZhongCar implements ICar {
    public void name() {
        System.out.println("我是大众");
    }
}
/**
 * 波音飞机
 *
 * @author Lion Li
 */
public class BoYinAircraft implements IAircraft {
    public void name() {
        System.out.println("我是波音");
    }
}
/**
 * 空客飞机
 *
 * @author Lion Li
 */
public class KongKeAircraft implements IAircraft {
    public void name() {
        System.out.println("我是空客");
    }
}

4.定义所有产品工厂实现

/**
 * 宝马汽车工厂
 *
 * @author Lion Li
 */
public class BaoMaCarFactory implements ICarFactory {
    public ICar create() {
        return new BaoMaCar();
    }
}
/**
 * 大众汽车工厂
 *
 * @author Lion Li
 */
public class DaZhongCarFactory implements ICarFactory {
    public ICar create() {
        return new DaZhongCar();
    }
}
/**
 * 波音飞机工厂
 *
 * @author Lion Li
 */
public class BoYinAircraftFactory implements IAircraftFactory {
    public IAircraft create() {
        return new BoYinAircraft();
    }
}
/**
 * 空客飞机工厂
 *
 * @author Lion Li
 */
public class KongKeAircraftFactory implements IAircraftFactory {
    public IAircraft create() {
        return new KongKeAircraft();
    }
}

5.定义交通工具抽象工厂

/**
 * 交通工具抽象工厂
 *
 * @author Lion Li
 */
public abstract class TransportationFactory {

    public void init() {
        System.out.println("初始化数据");
    }

    protected abstract ICar createCar(Class<? extends ICarFactory> clazz);

    protected abstract IAircraft createAircraft(Class<? extends IAircraftFactory> clazz);
}

6.定义出行方式工厂

/**
 * 出行方式工厂
 *
 * @author Lion Li
 */
public class TravelFactory extends TransportationFactory {
    @Override
    protected ICar createCar(Class<? extends ICarFactory> clazz) {
        super.init();
        if (null != clazz) {
            try {
                return clazz.newInstance().create();
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
        return null;
    }

    @Override
    protected IAircraft createAircraft(Class<? extends IAircraftFactory> clazz) {
        super.init();
        if (null != clazz) {
            try {
                return clazz.newInstance().create();
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
        return null;
    }
}

7.编写测试类并运行测试

/**
 * @author Lion Li
 */
public class Test {

    public static void main(String[] args){
        TransportationFactory factory = new TravelFactory();
        ICar baoma = factory.createCar(BaoMaCarFactory.class);
        baoma.name();
        ICar dazhong = factory.createCar(DaZhongCarFactory.class);
        dazhong.name();
        IAircraft boyin = factory.createAircraft(BoYinAircraftFactory.class);
        boyin.name();
        IAircraft kongke = factory.createAircraft(KongKeAircraftFactory.class);
        kongke.name();
    }

}

Spring 工厂 BeanFactory 解析

这里由于网上已经有很多成熟的解析文档 就不多做介绍了

推荐文章链接: Spring 的工厂模式 BeanFactory 是什么源码刨析

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/255231.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring IOC—基于注解配置和管理Bean 万字详解(通俗易懂)

目录 一、前言 二、基于注解配置Bean 1.基本介绍 : 2.应用实例 : 3.注意事项 : 三、手动实现Spring 注解配置机制 1.需求 : 2.思路 : 3.实现 : 3.1 自定义注解类 3.2 自定义配置类 3.3 自定义容器类 3.4 在测试类中进行测试 四、自动装配 0.总述 : 1.AutoWired自动装…

Autosar DEM DTC的Debounce策略

文章目录 简介Debounce策略1、基于计数器的 Debounce 策略2、基于时间的Debounce策略 简介 故障事件防抖&#xff0c;与按键防抖&#xff08;软件需要延时确认按键不是误触发&#xff09;的作用类似&#xff0c;目的是为了防止事件误触发采取的策略。 因为DTC并不是一达到触发…

Transformer Decoder的输入

大部分引用参考了既安的https://www.zhihu.com/question/337886108/answer/893002189这篇文章&#xff0c;个人认为写的很清晰&#xff0c;此外补充了一些自己的笔记。 弄清楚Decoder的输入输出&#xff0c;关键在于图示三个箭头的位置&#xff1a; 以翻译为例&#xff1a; 输…

2023.12.16 关于 分布式系统 基本介绍

目录 单机架构 服务器负载过高问题 解决方法 分布式系统 引入更多的服务器节点 负载均衡 数据库读写分离 引入缓存 数据库分库分表 引入微服务 基本概念 应用&#xff08;Application&#xff09;/ 系统&#xff08;System&#xff09; 模块&#xff08;Modul…

力扣日记12.18-【二叉树篇】合并二叉树

力扣日记&#xff1a;【二叉树篇】合并二叉树 日期&#xff1a;2023.12.18 参考&#xff1a;代码随想录、力扣 617. 合并二叉树 题目描述 难度&#xff1a;简单 给你两棵二叉树&#xff1a; root1 和 root2 。 想象一下&#xff0c;当你将其中一棵覆盖到另一棵之上时&#xf…

软件测试培训三个月,想找到工作,到底应该怎么搞

功能方面&#xff1a;问的最多的就是测试流程&#xff0c;测试计划包含哪些内容&#xff0c;公司人员配置&#xff0c;有bug开发认为不是 bug怎么处理&#xff0c;怎样才算是好的用例&#xff0c;测试用例设计方法&#xff08;等价类&#xff0c;边界值等概念方法&#xff09;&…

C# 使用FluentHttpClient请求WebApi

写在前面 FluentHttpClient 是一个REST API 异步调用 HTTP 客户端&#xff0c;调用过程非常便捷&#xff0c;采用流式编程&#xff0c;可以将所有请求所需的参数一次性发送&#xff0c;并直接获取序列化后的结果。 老规矩从NuGet上安装该类库&#xff1a; 这边一定要认准是 P…

python/c++ Leetcode题解——1.两数之和

目录 方法1:枚举法 思路 Code 方法2:哈希表 思路 Code 方法1:枚举法 思路 最容易想到的方法是枚举数组中的每一个数 x&#xff0c;寻找数组中是否存在 target - x。 当我们使用遍历整个数组的方式寻找 target - x 时&#xff0c;需要注意到每一个位于 x 之前的元素都已…

使用GPU利用ffmpeg-在Pyhton代码中实现视频转码到MP4格式的过程记录【失败告终-原因是显示型号太老不支持】

01-安装Nvida的显卡驱动和CUDA 参考文章 https://blog.csdn.net/wenhao_ir/article/details/125253533 进行安装。 02-下载ffmpeg的可执行文件 下载ffmpeg的Windows可执行文件&#xff0c;下载页面&#xff1a; https://www.gyan.dev/ffmpeg/builds/#release-builds 我在202…

深度学习中的潜在空间

1 潜在空间定义 Latent Space 潜在空间&#xff1a;Latent &#xff0c;这个词的语义是“隐藏”的意思。“Latent Space 潜在空间”也可以理解为“隐藏的空间”。Latent Space 这一概念是十分重要的&#xff0c;它在“深度学习”领域中处于核心地位&#xff0c;即它是用来学习…

ROS机器人入门

http://www.autolabor.com.cn/book/ROSTutorials/ 1、ROS简介 ROS 是一个适用于机器人的开源的元操作系统。其实它并不是一个真正的操作系统&#xff0c;其 底层的任务调度、编译、寻址等任务还是由 Linux 操作系统完成&#xff0c;也就是说 ROS 实际上是运 行在 Linux 上的次级…

微信小程序开发学习(基础)

学习课程&#xff1a;2023最新零基础入门微信小程序开发_哔哩哔哩_bilibili 微信开发工具下载地址&#xff1a;微信开发者工具下载地址与更新日志 | 微信开放文档 开发文档&#xff1a;微信开放文档 创建新项目 机型&#xff1a;iPhoneX 快捷键 <view>.row{$}*8 <…

Android hilt使用

一&#xff0c;添加依赖库 添加依赖库app build.gradle.kts implementation("com.google.dagger:hilt-android:2.49")annotationProcessor("com.google.dagger:hilt-android:2.49")annotationProcessor("com.google.dagger:hilt-compiler:2.49"…

对偶问题笔记(1)

目录 1 从 Lagrange 函数引入对偶问题2. 强对偶性与 KKT 条件3. 对偶性的鞍点特征 1 从 Lagrange 函数引入对偶问题 考虑如下优化问题 { min ⁡ f 0 ( x ) s . t f i ( x ) ≤ 0 , i 1 , ⋯ , p , h j ( x ) 0 , j 1 , ⋯ , q , x ∈ Ω , \begin{align} \begin{cases}\min…

Pipelined-ADC设计一:序言

现在是2023年12月18日&#xff0c;准备开新帖&#xff0c;设计一个 流水线型 模数转换器&#xff08; Pipelined-ADC &#xff09;。记录帖&#xff0c;后续会放在咸鱼。同步记录&#xff0c;谨防盗用。 初定指标&#xff1a;12位50Mhz&#xff0c;采用2.5bit每级结构&#xff…

奇数魔方阵

魔方阵的生成方法为第0行中间位置为1 2开始的其余n*n-1个数&#xff0c;依次按以下规则存放 1.下一个元素存放在当前元素的上一行、下一列 2.如果上一行下一列已有元素&#xff0c;则下一个元素存放的位置为当前列的下一行 3.在找上一行、下一行或下一列的时候&#xff0c;把矩…

计算机组成原理——校验码

计算机组成原理学习笔记——校验码-CSDN博客 校验码——海明码及码距&#xff0c;码距_海明码的码距是多少-CSDN博客 1 下列关于码距与检错与纠错能力的描述中正确的是 &#xff08;ABC&#xff09; &#xff08;多选&#xff09; A. 码距为1的编码不具备任何检错能力 B. 码…

可能是全网最详细的线性回归原理讲解!!!

ps&#xff1a;此处的特征向量有别于线性代数中的特征向量&#xff0c;准确来讲这里的特征向量是一个样本的所有属性值。 用梯度下降慢慢逼近这个最小值点 本文图片来源于可能是全网最详细的线性回归原理讲解&#xff01;&#xff01;&#xff01;_哔哩哔哩_bilibili 可以结合…

C++学习笔记(十二)------is_a关系(继承关系)

你好&#xff0c;这里是争做图书馆扫地僧的小白。 个人主页&#xff1a;争做图书馆扫地僧的小白_-CSDN博客 目标&#xff1a;希望通过学习技术&#xff0c;期待着改变世界。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 文章目录 前言 一、继承关系…

基于Levenberg-Marquardt算法改进的BP神经网络-公式推导及应用

Levenberg-Marquardt算法是一种用于非线性最小化问题的优化算法&#xff0c;通常用于训练神经网络。它结合了梯度下降和高斯-牛顿方法的特点&#xff0c;旨在提高收敛速度和稳定性。下面是基于Levenberg-Marquardt算法改进的反向传播&#xff08;BP&#xff09;神经网络的详细推…