首頁 > Java > java教程 > 主體

Java工廠方法模式詳解

WBOY
發布: 2022-04-02 12:45:37
轉載
4665 人瀏覽過

本篇文章為大家帶來了關於java的相關知識,其中主要介紹了工廠方法模式的相關問題,工廠方法模式也叫虛擬建構器模式或多態工廠模式,它屬於類別創建型模式,希望對大家有幫助。

Java工廠方法模式詳解

推薦學習:《java教學

一、什麼是工廠方法模式?

工廠方法模式:也叫虛擬建構器模式或多型工廠模式,它屬於類別建立型模式。

在工廠方法模式中,工廠父類負責定義創建產品對象的公共接口,而工廠子類則負責生成具體的產品對象,這樣做的目的是將產品類的實例化作業延遲到工廠子類別中完成,也就是透過工廠子類別來決定究竟應該實例化哪一個特定產品類別。

我們知道在現在的真實工廠內分工越來越細,越來越專業化。 。各種產品都有專門的工廠生產,徹底告別了自給自足的小農經濟時代,這大大縮短了產品的生產週期,並提高了生產效率。而工廠方法模式即滿足了開閉原則,也繼承了簡單工廠模式的優點。

舉例說明:

在簡單工廠模式的文章中的可樂工廠,因為只有一個工廠類,所以任何產品都需要在這個類裡面去修改和調整,而工廠方法模式就是有多個工廠,每個工廠生產一個產品,如果有需要增加新產品,我們直接再新建一個工廠即可,就不需要在其他工廠的內部再去修改,這樣就符合了開閉原則。

二、工廠方法模式的優缺點

#優點:

  • 使用者只需要知道特定工廠的名稱就可得到所需的產品,無須知道產品的具體創建過程

  • 靈活性增強,對於新產品的創建,只需多寫一個相應的工廠類

  • #典型的解耦框架。高層模組只需要知道產品的抽象類,無須關心其他實現類,滿足迪米特法則、依賴倒置原則和里氏替換原則

##缺點:

  • 類別的數量容易過多,增加複雜度

  • #增加了系統的抽象性和理解難度

  • #抽象產品只能生產一種產品,此弊端可使用

    抽象工廠模式解決(抽象工廠模式在下一篇文章)

  • 三、模式的結構與實作

  • 結構由以下四個部分組成:
  • #抽象工廠(Abstract Factory):提供了創建產品的接口,呼叫者透過它訪問具體工廠的工廠方法newProduct() 來創建產品

具體工廠(ConcreteFactory):主要是實現抽象工廠中的抽象方法,完成具體產品的創建

Java工廠方法模式詳解

抽象產品(Product):定義了產品的規範,描述了產品的主要特性和功能


特定產品(ConcreteProduct):實作了抽象產品角色所定義的接口,由具體工廠來創建,它同具體工廠之間一一對應

#結構圖:

4、工廠方法模式代碼實現或以上一篇文章的可樂工廠為例:
產品有:可口可樂、百事可樂、無糖可樂

在簡單工廠模式中只有一個可樂工廠,可以生產三種產品,在工廠方法模式中就可以有多個工廠來產生對應的產品:

抽象工廠:

可樂工廠(可以理解成總廠)

百事可樂工廠: 生成百事可樂

可口可樂工廠: 生成可口可樂
#無糖可樂工廠:

產生無糖可樂

生產可樂的方法:

/**
 *  提供了产品的接口
 */public interface Cola {

    //生产可乐的方法
    public void cola();}
登入後複製
可樂抽象工廠:

/**
 * 可乐抽象工厂(可以理解成可乐总厂,旗下还有很多分厂)
 */public interface ColaFactory {

    public Cola newCola();}
登入後複製

  • #產生三種可樂的方法:
  • 可樂可樂:

    /**
     * 产品名称:可乐可乐,实现了产品的接口
     */public class CocaCola implements Cola{
    
        @Override
        public void cola() {
            System.out.println("开始生产可口可乐");
        }}
    登入後複製
    百事可樂:
/**
 *
 * 产品名称:百事可乐,实现了产品的接口
 */public class PepsiCola implements Cola{

    @Override
    public void cola() {
        System.out.println("开始生产百事可乐");
    }}
登入後複製
無糖可樂:

/*
 * 产品名称:无糖可乐,实现了产品的接口
 */public class SugarFreeCola implements Cola{

    @Override
    public void cola() {
        System.out.println("开始生产无糖可乐");
    }}
登入後複製
#三個產品對應三個工廠:

生產可口可樂的工廠:###
/**
 *
 * 具体工厂1:可口可乐工厂
 */public class CocaColaFactory implements ColaFactory{
    
    @Override
    public Cola newCola() {
        System.out.println("我是可乐工厂下面的可口可乐工厂");
        return new CocaCola();
    }}
登入後複製
###生產百事可樂的工廠:###
/**
 *
 * 具体工厂2:百事可乐工厂
 */public class PepsiColaFactory implements ColaFactory{

    @Override
    public Cola newCola() {
        System.out.println("我是可乐工厂下面的百事可乐工厂");
        return new PepsiCola();
    }}
登入後複製
###生產無糖可樂的工廠:###
/*
 * 具体工厂3:无糖可乐工厂
 */public class SugarFreeColaFactory implements ColaFactory{
    
    @Override
    public Cola newCola() {
        System.out.println("我是可乐工厂下面的无糖可乐工厂");
        return new SugarFreeCola();
    }}
登入後複製
## ####到這裡目前有:###############一生產可樂的方法############一個可樂工廠(下面有多個小工廠)############三個生產三種類型可樂的方法(實作可樂介面)############三個可樂工廠(生產三種可樂,實作可樂工廠介面)###############測試類別:######
public class Test {
    public static void main(String[] args) {

        try{

            //新建一个可乐方法对象
            Cola a;

            //新建一个可乐工厂对象
            ColaFactory af;

            //告诉可乐工厂,你需要什么可乐,并且通知对应的分工厂
            af = (ColaFactory) new PepsiColaFactory();
            //执行对于生产方法
            a = af.newCola();
            a.cola();
            
        }catch (Exception e ){
            System.out.println(e.getMessage());
        }
    }}
登入後複製
###例如我現在需要百事可樂,我在af內傳入百事可樂工廠:## #
我是可乐工厂下面的无糖可乐工厂
开始生产无糖可乐
登入後複製

如果传入CocaColaFactory

我是可乐工厂下面的可口可乐工厂
开始生产可口可乐
登入後複製

5、总结

这就是工厂方法模式,和简单工厂模式有所不同,在这个模式内有一个抽象工厂接口,也就是你需要增加新产品后,不需要在原本的工厂内去修改代码,而是直接新建一个工厂,去实现抽象工厂即可,也是符合了开闭原则。

当然缺点也就是工厂多了,管理变得复杂,也增加了系统的抽象性和理解难度,而且抽象产品只能生产一种产品,但是此弊端可使用抽象工厂模式解决(抽象工厂模式在下一篇文章)

推荐学习:《java教程

以上是Java工廠方法模式詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:csdn.net
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!