• 工厂模式:简化对象创建的设计思想 (设计模式 四)


    引言

    软件开发中,我们经常需要创建各种对象实例来满足不同的需求。通常情况下,我们会使用new关键字直接实例化对象,但这种方法存在一些问题,比如对象的创建逻辑分散在代码中,难以维护和扩展,同时也违反了面向对象设计的原则之一——"依赖倒置原则"。

    为了解决这些问题,设计模式中的工厂模式应运而生。工厂模式通过提供一个抽象的工厂接口来创建对象,将对象的创建逻辑封装在工厂中,从而实现了对象的解耦和创建的灵活性。


    工厂模式的核心思想

    工厂模式的核心思想是将对象的创建过程封装在一个工厂类中,客户端通过工厂类来获取所需的对象实例,工厂类根据客户端的请求,决定创建哪种具体的对象,并返回给客户端使用。

    工厂模式的主要目标是将对象的创建和使用解耦,使得客户端只需要关注接口而不需要关心具体的对象创建过程,这样可以提高代码的可维护性、灵活性和可扩展性。


    工厂模式的优势

    1. 降低耦合性

    工厂模式通过将对象的创建逻辑封装在工厂类中,使得客户端与具体的对象实现解耦,客户端只需要通过工厂接口来获取对象,而不需要了解对象的具体实现细节,这样可以降低模块之间的耦合性,提高代码的可维护性和可测试性。

    2. 简化对象创建过程

    工厂模式将对象的创建逻辑集中在一个工厂类中,客户端只需要调用工厂类的方法即可获取所需的对象实例,这样可以简化对象的创建过程,避免在代码中散落着大量的new关键字,提高代码的可读性和可维护性。

    3. 提供灵活的扩展性

    工厂模式通过抽象工厂接口和具体工厂类的实现,提供了一种灵活的扩展机制。当需要新增一种对象类型时,只需要新增一个具体工厂类即可,而无需修改客户端的代码,这样可以方便地扩展系统的功能,符合开闭原则


    工厂模式的应用场景

    工厂模式适用于以下场景:

    - 当一个类不知道它所需要的对象的确切类时,可以使用工厂模式来创建对象。

    - 当一个类希望通过子类来指定创建对象时,可以使用工厂模式。

    - 当需要灵活地管理和扩展对象的创建过程时,可以使用工厂模式。


    工厂模式的具体实现

    使用工厂模式来实现创建Bean对象的过程(模仿Spring的Bean工厂创建对象)

    1. Bean接口(bean的抽象方法)

    1. public interface Bean {
    2. void show();
    3. }

    2. BeanFactory接口(抽象工厂),定义了获取Bean实例的方法

    1. public interface BeanFactory {
    2. Bean getBean(String beanName);
    3. }

    3. DefaultBeanFactory实现BeanFactory接口(具体工厂)

    1. public class DefaultBeanFactory implements BeanFactory {
    2. //对象组件注册
    3. private Map beanRegistry;
    4. //初始化工厂
    5. public DefaultBeanFactory() {
    6. beanRegistry = new HashMap<>();
    7. // 在初始化时注册Bean实例
    8. beanRegistry.put("bean1", new Bean1());
    9. beanRegistry.put("bean2", new Bean2());
    10. }
    11. //根据bean名字获取实例
    12. public Bean getBean(String beanName) {
    13. return beanRegistry.get(beanName);
    14. }
    15. }

    BeanContainer类(容器),用于管理BeanFactory和Bean实例,相对于工厂模式这一步是额外加的

    1. public class BeanContainer {
    2. //bean工厂
    3. private BeanFactory beanFactory;
    4. //存储bean
    5. private Map beanInstances;
    6. //初始化容器
    7. public BeanContainer() {
    8. beanFactory = new DefaultBeanFactory();
    9. beanInstances = new HashMap<>();
    10. }
    11. //获取bean
    12. public Bean getBean(String beanName) {
    13. Bean bean = beanInstances.get(beanName);
    14. if (bean == null) {
    15. //只创建一次
    16. bean = beanFactory.getBean(beanName);
    17. beanInstances.put(beanName, bean);
    18. }
    19. return bean;
    20. }
    21. }

    4. 创建实现类(实现bean接口),客户端测试工厂模式创建对象

    1. public class Bean1 implements Bean {
    2. public void show() {
    3. System.out.println("Bean1创建成功...");
    4. }
    5. }
    6. public class Bean2 implements Bean {
    7. public void show() {
    8. System.out.println("Bean2创建成功...");
    9. }
    10. }
    1. public class Main{
    2. public static void main(String[] args) {
    3. //获取容器
    4. BeanContainer beanContainer = new BeanContainer();
    5. //从容器里面取出对象
    6. Bean bean1 = beanContainer.getBean("bean1");
    7. Bean bean2 = beanContainer.getBean("bean2");
    8. //测试调用
    9. bean1.show();
    10. bean2.show();
    11. }
    12. }

  • 相关阅读:
    [附源码]java毕业设计鑫地酒店酒水库存管理系统论文
    关于sqli-labs-master靶场的SQL注入问题。
    LeetCode刷题(python版)——Topic72. 编辑距离
    开发指导—利用组件&插值器动画实现 HarmonyOS 动效
    机器学习强基计划2-1:一文总结熵——交叉熵、相对熵、互信息(附例题分析)
    内容分发网络 CDN
    MPEG算法及代码例程
    北斗导航 | 自动驾驶多模态传感器融合综述
    一篇文章学会C#的正则表达式
    java版Spring Cloud+Mybatis+Oauth2+分布式+微服务+实现工程管理系统
  • 原文地址:https://blog.csdn.net/DU9999999/article/details/133590998