7

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

 1 year ago
source link: https://www.cnblogs.com/Raiden-xin/p/17255670.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

工厂模式简介

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

举个现实生活中的例子:你需要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类及其相关子类。

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

1657107-20230326101438619-1136502970.jpg

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK