嗨,老鐵!聽說你想了解一下工廠模式?

2023-03-26 15:02:42

嗨,老鐵!聽說你想了解一下工廠模式?沒問題,這個話題可是我的拿手好戲,接下來就由我為你詳細介紹設計模式中的工廠模式

工廠模式簡介

首先,讓我們從模式基礎知識開始吧。是一種建立型設計模式,它提供了一種方法來封裝物件的建立過程。它的基本思想是定義一個抽象工廠介面,該介面具有一個或多個方法用於建立物件,然後由具體工廠類實現該介面並提供實際的實現。使用者端程式碼可以通過這些工廠方法來建立物件。其核心目標是將物件的建立與使用分離。這使得使用者端程式碼可以更加靈活地使用物件,而不必關心物件的建立過程。如果我們需要更改物件的建立方式,我們只需要修改工廠類的實現即可,而不必修改使用者端程式碼。可以幫助我們降低程式碼的耦合性,並提高程式碼的可維護性和可延伸性。

舉個現實生活中的例子:你需要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類及其相關子類。

結尾

總之,工廠模式是一種常見的設計模式,它能將物件的建立過程與使用過程分離,使程式碼更易於維護和擴充套件。在實際開發中,我們可以結合其他設計模式和程式設計技巧來使用工廠模式,例如單例模式、抽象工廠模式、依賴注入等。如果你還不瞭解這些設計模式,別擔心,我們可以在以後的文章中一一為你介紹。
如果覺得好的話請點個贊喲。