• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • 非官方解讀工廠模式

    標簽: 設計模式  java  

    工廠方法模式其中包含兩種,這里就寫在一起了,包含普通工廠模式和抽象方法模式,工廠模式可以在一定程度上減少coding,只能是一定程度上.因為我們在使用中往往會增加coding.它最明顯的好處是代碼隔離,復用,解耦.可以理解為我們將復雜的對象的實例化放在工廠模式中進行處理,在使用時工廠模式透明,我們不需要去關心內部如何實現.而解耦則是我們在進行編程時不會進行強制的指向,即通過工廠模式作為統一入口來獲取實例即可.作者是個二吊子,如果描述有誤請指出.


    工廠模式的種類

    本文描述三種,含簡單工廠模式,普通工廠模式,抽象工廠模式.需要注意簡單工廠模式未列入二十三種設計模式中

    簡單工廠模式(非23種之一,算不上)

    uml圖
    簡單工廠uml

    我們產品抽象是車-Car,其中實現有燃氣車GasCar,燃油車OilCar兩種.實現了Car中的行為.SimpleFactory為工廠類,提供了獲取實例的方法,通過參數進行控制獲取的具體實例.以下為代碼

    /**
     * @Description: 抽象類,抽象了產品的行為.這里使用了抽象類,用接口也可以,并無不妥,只是可能受到單根繼承的影響,此處為簡單示例
     * @Author: gaofan
     * @Date: 2020/3/20 10:35
     * @Copyright: 2020 www.withu.top Inc. All rights reserved.
     **/
    public abstract class Car {
    
        // 運行
        public abstract void run();
        // 開窗
        public abstract void openWindow();
        // 停車
        public abstract void stop();
    
    }
    
    /**
     * @Description: 繼承了Car,實現了其行為
     * @Author: gaofan
     * @Date: 2020/3/20 10:40
     * @Copyright: 2020 www.withu.top Inc. All rights reserved.
     **/
    public class GasCar extends Car {
    
        public void run() {
            System.out.println("燃氣車運行了...");
        }
    
        public void openWindow() {
            System.out.println("燃氣車開窗了...");
        }
    
        public void stop() {
            System.out.println("燃氣車停止了...");
        }
    }
    
    /**
     * @Description: 繼承了Car,實現了其行為
     * @Author: gaofan
     * @Date: 2020/3/20 10:39
     * @Copyright: 2020 www.withu.top Inc. All rights reserved.
     **/
    public class OilCar extends Car{
    
        public void run() {
            System.out.println("燃油車運行了...");
        }
    
        public void openWindow() {
            System.out.println("燃油車開窗了...");
        }
    
        public void stop() {
            System.out.println("燃油車停止了...");
        }
    }
    
    /**
     * @Description: 簡單工廠或者叫靜態工廠模式
     * @Author: gaofan
     * @Date: 2020/3/20 11:04
     * @Copyright: 2020 www.withu.top Inc. All rights reserved.
     **/
    public class SimpleFactory {
    
        public static Car getCar(String car) {
            if ("gas".equals(car)) {
                return new GasCar();
            } else if ("oil".equals(car)) {
                return new OilCar();
            } else {
                return null;
            }
        }
    }
    

    類型: 簡單工廠模式
    原理: 以入參來限定工廠方法返回類型,使用工廠模式可以減少代碼維護量.但是這里會出現問題,我們在新增產品時就必須要改動工廠類并新增實體.就違反了開閉原則了.不建議使用

    普通工廠模式

    為每一個產品構造一個工廠類,用來創建,普通工廠模式是創造一種產品.
    uml圖
    普通工廠uml

    為每一個產品提供一個工廠類.使用時根據多態.

    /**
     * @Description: 抽象類
     * @Author: gaofan
     * @Date: 2020/3/20 10:35
     * @Copyright: 2020 www.withu.top Inc. All rights reserved.
     **/
    public abstract class Car {
    
        // 運行
        public abstract void run();
        // 開窗
        public abstract void openWindow();
        // 停車
        public abstract void stop();
    
    }
    
    /**
     * @Description: 燃油車
     * @Author: gaofan
     * @Date: 2020/3/20 10:39
     * @Copyright: 2020 www.withu.top Inc. All rights reserved.
     **/
    public class OilCar extends Car{
    
        public void run() {
            System.out.println("燃油車運行了...");
        }
    
        public void openWindow() {
            System.out.println("燃油車開窗了...");
        }
    
        public void stop() {
            System.out.println("燃油車停止了...");
        }
    }
    
    /**
     * @Description: 燃氣車
     * @Author: gaofan
     * @Date: 2020/3/20 10:40
     * @Copyright: 2020 www.withu.top Inc. All rights reserved.
     **/
    public class GasCar extends Car {
    
        public void run() {
            System.out.println("燃氣車運行了...");
        }
    
        public void openWindow() {
            System.out.println("燃氣車開窗了...");
        }
    
        public void stop() {
            System.out.println("燃氣車停止了...");
        }
    }
    
    /**
     * @Description: 工廠根類
     * @Author: gaofan
     * @Date: 2020/3/20 16:20
     * @Copyright: 2020 www.withu.top Inc. All rights reserved.
     **/
    public interface Factory {
    
        Car create();
    
    }
    
    /**
     * @Description: 燃氣車工廠類
     * @Author: gaofan
     * @Date: 2020/3/20 16:20
     * @Copyright: 2020 www.withu.top Inc. All rights reserved.
     **/
    public class GasCarFactory implements Factory {
        public Car create() {
            return new GasCar();
        }
    }
    
    /**
     * @Description: 燃油車工廠類
     * @Author: gaofan
     * @Date: 2020/3/20 16:21
     * @Copyright: 2020 www.withu.top Inc. All rights reserved.
     **/
    public class OilCarFactory implements Factory {
    
        public Car create() {
            return new OilCar();
        }
    }
    

    類型: 普通工廠模式
    原理: 為每一個產品創建一個工廠類,解決了簡單工廠中違背開閉原則的情況.我們在后續如果需要新增一個產品,只需要創建產品類即工廠類即可.
    缺點: 編碼會增多

    抽象工廠模式

    普通工廠模式是創建一種產品,而抽象工廠則是一類,進行了歸集.可以理解為產品簇使用場景.
    抽象工廠uml

    便于我們在復雜的產品層級中使用,新增一類產品時,我們只需要繼承工廠類,新增產品即可.這里需要注意的是,如果工廠抽象類中的方法不夠通用則可以下沉,如果還有其他通用方法也可以提升到抽象類中.靈活使用

    /**
     * @Description: 抽象類,這是整體的抽象,最基本的抽象
     * @Author: gaofan
     * @Date: 2020/3/20 10:35
     * @Copyright: 2020 www.withu.top Inc. All rights reserved.
     **/
    public abstract class Car {
    
        // 運行
        public abstract void run();
        // 開窗
        public abstract void openWindow();
        // 停車
        public abstract void stop();
    
    }
    
    /**
     * @Description: 載物燃氣車
     * @Author: gaofan
     * @Date: 2020/3/20 10:40
     * @Copyright: 2020 www.withu.top Inc. All rights reserved.
     **/
    public class CargoGasCar extends Car {
    
        public void run() {
            System.out.println("載物燃氣車運行了...");
        }
    
        public void openWindow() {
            System.out.println("載物燃氣車開窗了...");
        }
    
        public void stop() {
            System.out.println("載物燃氣車停止了...");
        }
    }
    
    /**
     * @Description: 載物燃油車
     *
     * @Author: gaofan
     * @Date: 2020/3/20 10:39
     * @Copyright: 2020 www.withu.top Inc. All rights reserved.
     **/
    public class CargoOilCar extends Car {
    
        public void run() {
            System.out.println("載物燃油車運行了...");
        }
    
        public void openWindow() {
            System.out.println("載物燃油車開窗了...");
        }
    
        public void stop() {
            System.out.println("載物燃油車停止了...");
        }
    }
    
    /**
     * @Description: 載人燃氣車
     * @Author: gaofan
     * @Date: 2020/3/20 10:40
     * @Copyright: 2020 www.withu.top Inc. All rights reserved.
     **/
    public class MannedGasCar extends Car {
    
        public void run() {
            System.out.println("載人燃氣車運行了...");
        }
    
        public void openWindow() {
            System.out.println("載人燃氣車開窗了...");
        }
    
        public void stop() {
            System.out.println("載人燃氣車停止了...");
        }
    }
    
    /**
     * @Description: 載人燃油車
     * @Author: gaofan
     * @Date: 2020/3/20 10:39
     * @Copyright: 2020 www.withu.top Inc. All rights reserved.
     **/
    public class MannedOilCar extends Car {
    
        public void run() {
            System.out.println("載人燃油車運行了...");
        }
    
        public void openWindow() {
            System.out.println("載人燃油車開窗了...");
        }
    
        public void stop() {
            System.out.println("載人燃油車停止了...");
        }
    }
    
    
    /**
     * @Description: TODO
     * @Author: gaofan
     * @Date: 2020/3/20 14:08
     * @Copyright: 2020 www.withu.top Inc. All rights reserved.
     **/
    public interface CarFactory {
    
        // 創建載物車
        Car createCarGoCar();
        // 創建載人車
        Car createMannedCar();
    }
    
    /**
     * @Description: 燃氣車工廠子類
     * @Author: gaofan
     * @Date: 2020/3/20 14:08
     * @Copyright: 2020 www.withu.top Inc. All rights reserved.
     **/
    public class GasCarFactory implements CarFactory{
    
        public Car createCarGoCar() {
            return new CargoGasCar();
        }
    
        public Car createMannedCar() {
            return new MannedGasCar();
        }
    }
    
    /**
     * @Description: 燃油車工廠子類
     * @Author: gaofan
     * @Date: 2020/3/20 14:08
     * @Copyright: 2020 www.withu.top Inc. All rights reserved.
     **/
    public class OilCarFactory implements CarFactory {
    
        public Car createCarGoCar() {
            return new CargoOilCar();
        }
    
        public Car createMannedCar() {
            return new MannedOilCar();
        }
    }
    

    類型: 抽象工廠模式
    原理: 用于一類產品而非一個,通過抽象再抽象的思想,創建產品的抽象和工廠的抽象
    缺點: 無


    本文借鑒尚硅谷Java設計模式,韓順平圖解java,傳送門

    版權聲明:本文為sky_demo原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/sky_demo/article/details/104991712

    智能推薦

    寂然解讀設計模式 - 工廠模式 - 抽象工廠模式

    工廠模式 - 抽象工廠模式 ? 寂然 大家好~,我是寂然,本節課呢,我們接著來聊工廠模式的第三種,抽象工廠模式,以及工廠模式在 JDK源碼中的應用,最后,我們明確幾點工廠模式的注意事項,對工廠模式進行總結,那我們啟程吧 基本介紹 - 抽象工廠模式 抽象工廠模式:定義了一個 interface 用于創建相關或有依賴關系的對象簇,而無需指明具體的類 對象簇即一系列對象 抽象工廠模式可以將簡單工廠模式和...

    寂然解讀設計模式 - 工廠模式 - 工廠方法模式

    工廠模式 - 工廠方法模式 ? 寂然 大家好~,我是寂然,本節課呢,我們接著圍繞披薩訂購這樣一個需求來聊工廠模式第二種,工廠方法模式,首先,我們對上節課的內容進行簡單的回顧 前情提要 首先,我們上節課提出了這樣一個需求 有這樣一個披薩店的需求,披薩的種類很多(比如 GreekPizz、CheesePizz 等) 披薩的制作有 prepare,bake,cut,box 等 要求:完成披薩店訂購功能,...

    寂然解讀設計模式 - 工廠模式 - 簡單工廠模式

    工廠模式 - 簡單工廠模式 ? 寂然 大家好~,我是寂然,本節課呢,我們來看下一個,工廠模式, 工廠模式(Factory Pattern)是 Java 中最常用的設計模式之一,無論是實際應用還是面試都非常高頻和廣泛,話不多說,那我們開始啟程吧 案例引出 - 披薩訂購 那在聊工廠模式之前,我們現來看一個需求 有這樣一個披薩店的需求,披薩的種類很多(比如 GreekPizz、CheesePizz 等)...

    JDK源碼的分析解讀——工廠模式

    廠顧名思義就是創建產品,根據產品是具體產品還是具體工廠可分為簡單工廠模式和工廠方法模式,根據工廠的抽象程度可分為工廠方法模式和抽象工廠模式。該模式用于封裝和管理對象的創建,是一種創建型模式。本文從一個具體的例子逐步深入分析,來體會三種工廠模式的應用場景和利弊。 1. 簡單工廠模式 該模式對對象創建管理方式最為簡單,因為其僅僅簡單的對不同類對象的創建進行了一層薄薄的封裝。該模式通過向工廠傳遞類型來指...

    wmctf web部分wp(非官方qwq

    web_checkin 隊友@小白菜 隨便試了一個content=/flag就出flag了(后期知道是因為文件名的非預期 Make PHP Great Again 看著短短的五行代碼,實在難做嚶嚶嚶 后來得知是session.upload_progress(后知后覺 那就開整! 參考文章了https://www.freebuf.com/news/202819.html 改了一下就開跑! 然后就出來...

    猜你喜歡

    YEOMAN官方文檔非官方翻譯~快速使用(codelab)

    在25分鐘的 codelab(編碼實驗) 中,你將在 Yeoman、FountainJS 的幫助下,通過腳手架構建起一個功能完整的web應用。這個簡單的應用將會用 React、Angular2、Angular1 來編寫。 不知道 React 或者 Angular?沒關系,我們將會幫您渡過難關。然而,我們必須假定你先前已經有了一些 JavaScript 的編程經驗。 通過Yeoman構建這個簡單的應...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    requests實現全自動PPT模板

    http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    精品国产乱码久久久久久蜜桃不卡