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

引言

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

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


工厂模式的核心思想

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

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


工厂模式的优势

1. 降低耦合性

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

2. 简化对象创建过程

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

3. 提供灵活的扩展性

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


工厂模式的应用场景

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

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

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

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


工厂模式的具体实现

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

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

java 复制代码
public interface Bean {
    void show();
}

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

java 复制代码
public interface BeanFactory {
    Bean getBean(String beanName);
}

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

java 复制代码
public class DefaultBeanFactory implements BeanFactory {
    //对象组件注册
    private Map<String, Bean> beanRegistry;

    //初始化工厂
    public DefaultBeanFactory() {
        beanRegistry = new HashMap<>();
        // 在初始化时注册Bean实例
        beanRegistry.put("bean1", new Bean1());
        beanRegistry.put("bean2", new Bean2());
    }

    //根据bean名字获取实例
    public Bean getBean(String beanName) {
        return beanRegistry.get(beanName);
    }
}

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

java 复制代码
public class BeanContainer {
    //bean工厂
    private BeanFactory beanFactory;
    //存储bean
    private Map<String, Bean> beanInstances;

    //初始化容器
    public BeanContainer() {
        beanFactory = new DefaultBeanFactory();
        beanInstances = new HashMap<>();
    }

    //获取bean
    public Bean getBean(String beanName) {
        Bean bean = beanInstances.get(beanName);
        if (bean == null) {
            //只创建一次
            bean = beanFactory.getBean(beanName);
            beanInstances.put(beanName, bean);
        }
        return bean;
    }
}

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

java 复制代码
public class Bean1 implements Bean {
    public void show() {
        System.out.println("Bean1创建成功...");
    }
}


public class Bean2 implements Bean {
    public void show() {
        System.out.println("Bean2创建成功...");
    }
}
java 复制代码
public class Main{
    public static void main(String[] args) {
        //获取容器
        BeanContainer beanContainer = new BeanContainer();

        //从容器里面取出对象
        Bean bean1 = beanContainer.getBean("bean1");
        Bean bean2 = beanContainer.getBean("bean2");

        //测试调用
        bean1.show();
        bean2.show();
    }
}
相关推荐
梓仁沐白13 小时前
【Agent 设计模式】多智能体协作
microsoft·设计模式·php
努力学习的廖同学13 小时前
前端进阶-设计模式
设计模式
workflower1 天前
情境感知系统
人工智能·机器学习·设计模式·自然语言处理·机器人
咖啡八杯2 天前
设计模式中的原则
设计模式·接口隔离原则·里氏替换原则·开闭原则·合成复用原则·单一职责原则
安冬的码畜日常2 天前
【工欲善其事】深入理解 Node.js 带并发上限的异步任务批量执行逻辑
javascript·设计模式·node.js·ai编程·异步编程·并发执行
AI大法师2 天前
一个机场如何被做成 IP 场景:宝可梦机场的设计方法总结
大数据·人工智能·设计模式·新媒体运营
晚安code2 天前
干掉成山的 if-else:工厂造、策略选,一文讲透两个模式的配合
后端·设计模式
workflower3 天前
从幻觉,到现实
人工智能·深度学习·机器学习·设计模式·机器人
电子科技圈3 天前
第二代无线平台历久弥新,赋能物联网创新迭代
人工智能·嵌入式硬件·mcu·物联网·设计模式·硬件架构·iot
choumin3 天前
创建型模式——工厂方法模式
c++·设计模式·工厂方法模式·创建型模式