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

引言

在软件开发中,我们经常需要创建各种对象实例来满足不同的需求。通常情况下,我们会使用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();
    }
}
相关推荐
晨米酱9 小时前
JavaScript 中"对象即函数"设计模式
前端·设计模式
数据智能老司机14 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机15 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机15 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机15 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
使一颗心免于哀伤16 小时前
《设计模式之禅》笔记摘录 - 21.状态模式
笔记·设计模式
数据智能老司机1 天前
精通 Python 设计模式——创建型设计模式
python·设计模式·架构
数据智能老司机2 天前
精通 Python 设计模式——SOLID 原则
python·设计模式·架构
烛阴2 天前
【TS 设计模式完全指南】懒加载、缓存与权限控制:代理模式在 TypeScript 中的三大妙用
javascript·设计模式·typescript
李广坤2 天前
工厂模式
设计模式