首页 > 其他分享 >嗨,老铁!听说你想了解一下工厂模式?

嗨,老铁!听说你想了解一下工厂模式?

时间:2023-03-26 10:46:23浏览次数:40  
标签:老铁 BeanFactory 创建 模式 工厂 bean public

嗨,老铁!听说你想了解一下工厂模式?没问题,这个话题可是我的拿手好戏,接下来就由我为你详细介绍设计模式中的工厂模式

工厂模式简介

首先,让我们从模式基础知识开始吧。是一种创建型设计模式,它提供了一种方法来封装对象的创建过程。它的基本思想是定义一个抽象工厂接口,该接口具有一个或多个方法用于创建对象,然后由具体工厂类实现该接口并提供实际的实现。客户端代码可以通过这些工厂方法来创建对象。其核心目标是将对象的创建与使用分离。这使得客户端代码可以更加灵活地使用对象,而不必关心对象的创建过程。如果我们需要更改对象的创建方式,我们只需要修改工厂类的实现即可,而不必修改客户端代码。可以帮助我们降低代码的耦合性,并提高代码的可维护性和可扩展性。

举个现实生活中的例子:你需要1-3周岁的宝宝奶粉的时候,只需要找到一个奶粉工厂购买就行,不需要知道牛奶从牛身上挤下来后,又经过了哪些过程,哪些处理才变成了奶粉。假如需要换成4-6周岁只需要换个工厂就行,简单快捷。

在工厂模式中,通常有三个重要的角色:抽象工厂接口、具体工厂类和产品类。抽象工厂接口定义了一个或多个工厂方法,用于创建产品对象。具体工厂类实现了抽象工厂接口,并提供实际的产品创建方法。产品类是工厂方法创建的对象,其实现方式可能因具体工厂类的不同而异。

工厂模式的范例

接下来让我们来看一下使用代码示例。下面是一个简单的工厂模式的示例,我们来看一下它是如何工作的。

/**
 * 上层抽象接口类
 */
public interface Animal {
    void speak();
}
/**
 * 具体动物实现类 狗
 */
public class Dog implements Animal {
    @Override
    public void speak() {
        System.out.println("Dog says: Bark");
    }
}
/**
 * 具体动物实现类 猫
 */
public class Cat implements Animal {
    @Override
    public void speak() {
        System.out.println("Cat says: Meow");
    }
}
/**
 * 动物生产工厂类
 */
public class AnimalFactory {
    public static Animal createAnimal(String type) {
        if ("dog".equalsIgnoreCase(type)) {
            return new Dog();
        } else if ("cat".equalsIgnoreCase(type)) {
            return new Cat();
        }
        return null;
    }
}

public class Main {
    public static void main(String[] args) {
        Animal dog = AnimalFactory.createAnimal("dog");
        dog.speak();

        Animal cat = AnimalFactory.createAnimal("cat");
        cat.speak();
    }
}

在这个示例中,我们定义了一个 Animal 接口和两个实现类:Dog 和 Cat。AnimalFactory 类是一个工厂类,它提供了一个静态方法 createAnimal 来创建 Animal 对象。在 main 方法中,我们调用 createAnimal 方法来创建 Dog 和 Cat 对象,并分别调用它们的 speak 方法。

工厂模式的好处

那么,工厂模式有什么好处呢?首先,它能将对象的创建过程与使用过程分离,使代码更易于维护和扩展。其次,它可以隐藏对象的创建细节,使客户端代码更简洁。还可以根据需要更改对象的创建方式,例如更改对象的实现类、更改对象的初始化参数等。最后,它可以将对象的创建过程集中在一个工厂类中,提高代码的复用性和可维护性。

工厂模式的不足之处

当然,工厂模式并不是万能的,它也有一些缺点。首先,如果工厂类中创建的对象过多,工厂类会变得臃肿和难以维护。其次,如果需要创建的对象有多种不同类型,那么需要为每种类型都定义一个工厂方法,这样会导致工厂类变得复杂和难以理解。最后,工厂模式可能会导致类的数量增加,使代码变得更加复杂。

工厂模式在源码中的运用

工厂模式在开源代码中得到了广泛的应用,例如 Spring Framework、Apache Commons Codec、Joda-Time、MyBatis、Hibernate、Guava 等等。这些开源框架和库都使用了工厂模式来创建对象,使代码更加灵活和易于扩展。比如,在Spring中,有很多地方都使用了工厂模式,例如BeanFactory、ApplicationContext、AutowireCapableBeanFactory等。下面以BeanFactory为例,简要介绍一下Spring源码中的工厂模式实现。 BeanFactory是Spring中最基本的工厂模式,它负责创建和管理应用程序中的对象(也称为bean)。BeanFactory定义了创建和获取bean的接口,具体的实现则由不同的子类完成。在Spring源码中,BeanFactory的主要实现类是DefaultListableBeanFactory。该类实现了BeanFactory接口,并扩展了AbstractAutowireCapableBeanFactory抽象类,提供了创建和管理bean的核心功能。

下面是一个简单的例子,展示了Spring源码中如何使用BeanFactory创建和管理bean:

public class MyBean {
    private String message;

    public void setMessage(String message) {
        this.message = message;
    }

    public String getMessage() {
        return message;
    }
}
// 创建BeanFactory
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();

// 创建bean定义
RootBeanDefinition beanDefinition = new RootBeanDefinition(MyBean.class);
beanDefinition.getPropertyValues().add("message", "Hello, world!");

// 注册bean定义
beanFactory.registerBeanDefinition("myBean", beanDefinition);

// 获取bean实例
MyBean myBean = (MyBean) beanFactory.getBean("myBean");

// 输出bean的消息
System.out.println(myBean.getMessage());

在这个例子中,我们首先创建了一个DefaultListableBeanFactory对象作为BeanFactory。然后,我们使用RootBeanDefinition来创建一个bean定义,指定了bean的类和属性值。接着,我们将该bean定义注册到BeanFactory中,并指定了bean的名称为"myBean"。最后,我们使用BeanFactory的getBean方法来获取bean实例,输出了其消息。

总之,在Spring源码中,工厂模式的应用非常广泛,贯穿了整个框架的核心功能。如果您想深入了解Spring的工厂模式实现,可以进一步研究DefaultListableBeanFactory类及其相关子类。

结尾

总之,工厂模式是一种常见的设计模式,它能将对象的创建过程与使用过程分离,使代码更易于维护和扩展。在实际开发中,我们可以结合其他设计模式和编程技巧来使用工厂模式,例如单例模式、抽象工厂模式、依赖注入等。如果你还不了解这些设计模式,别担心,我们可以在以后的文章中一一为你介绍。
如果觉得好的话请点个赞哟。

标签:老铁,BeanFactory,创建,模式,工厂,bean,public
From: https://www.cnblogs.com/Raiden-xin/p/17255670.html

相关文章

  • js刷题时ACM模式
    一、前言在牛客网用JavaScript做前端编程题,真的是无力吐槽了,写一个输入输出折腾了我半天,在此记录一下,如何使用JavaScript编程语言在牛客网这种平台写输入输出相关的代......
  • 设计模式-用代理模式(Proxy Pattern)来拯救你的代码:打造可靠的程序设计
    前言设计模式是一种高级编程技巧,也是一种通用的解决方案。它能在不同的应用场景中使用,它可以提高代码的可读性、可复用性和可维护性。设计模式的学习能提高我们的编程能力......
  • 说说双重检查加锁单例模式为什么两次判断?
    先列段代码:publicclassSingleton{privatestaticvolatileSingletonsingleton=null;privateSingleton(){}publicstaticSingletongetI......
  • Lvs负载均衡dr模式
    防火墙生成外网网卡修改防火墙外网ip修改内网ip重启网卡查看ip启动防火墙设置开机自启开启路由转发功能修改ip添加网关配置lvs负载均衡ip重启网络服务查看ip配置内核参数......
  • 设计模式之单例模式C++实现
    初步用C++实现单例模式,暂未考虑线程安全问题#include<stdio.h>#include<iostream>usingstd::cout;usingstd::cin;usingstd::endl;//单例模式的设计需求:一个......
  • 结构型-代理模式
    定义  代理是一个中间者的角色,如生活中的中介,出于种种考虑/限制,一个对象不能直接访问另一个对象,需要一个第三者(中间代理)牵线搭桥从而间接达到访问目的,这样的就是代理......
  • 主机、虚拟机和开发板网络连接(虚拟机桥接模式)
    一.为主机配置合适的IP,子网掩码,网关以及DNS服务器步骤:右击网络-->“打开“网络和Internet”设置-->更改适配器选项-->本地连接(或者叫以太网)-->属性 -->Interne......
  • 前端设计模式——委托模式
    委托模式(Delegationpattern):将一个对象的某个方法委托给另一个对象来执行,它可以帮助我们将对象之间的关系更加灵活地组织起来,从而提高代码的可维护性和复用性。在委托模式......
  • IntelliJ IDEA 修改只读模式和可写模式
    可以在IntelliJIDEA对代码修改为只读模式。当你把一个源代码修改为只读模式的话,在右上角将会显示这个文件为只读的。如果你希望把这文件修改为可写的,可以直接......
  • java学习日记20230325-模版设计模式
    模版设计模式利用多态的动态绑定,将通用的方法设计为模版抽象类,通过子类继承重写抽象方法实现模版调用。 父类抽象类abstractpublicclassTemplate{......