java設計模式2————工廠模式

来源:https://www.cnblogs.com/xgp123/archive/2020/02/12/12300449.html
-Advertisement-
Play Games

1、工廠模式介紹: 2、簡單工廠模式 3、工廠方法模式 4、小結 5、抽象工廠模式 ...


java設計模式2————工廠模式

1、工廠模式介紹:

1.1、實現了創建者與調用者的分離

1.2、詳細分類:

  • 簡單工廠模式
  • 工廠方法模式
  • 抽象工廠模式

1.3、所遵循的OOP原則:

  • 開閉原則:對擴展開放,對修改關閉
  • 依賴倒轉原則:面向介面編程
  • 迪米特法則:只與你直接的朋友進行通信,而避免與陌生人進行通信。

1.4、核心本質

  • 實例化對象,不使用new,用工廠方法代替
  • 將調用者與我們的實現類解耦

1.5、三種模式

2、簡單工廠模式

2.1、先建立汽車抽象類

package com.xgp.company.第二種_工廠模式.簡單工廠模式;

public interface Car {

    void name();
}

2.2、製造車

製造“五凌”車

package com.xgp.company.第二種_工廠模式.簡單工廠模式;

public class WuLing implements Car {
    @Override
    public void name() {
        System.out.println("五凌巨集觀");
    }
}

製造“特斯拉”車

package com.xgp.company.第二種_工廠模式.簡單工廠模式;

public class Tesla implements Car {
    @Override
    public void name() {
        System.out.println("特斯拉");
    }
}

2.3、創建汽車工廠(兩種方式工廠製造對像)

package com.xgp.company.第二種_工廠模式.簡單工廠模式;
/**
 * 簡單工廠模式,又成為靜態工廠模式
 * 弊端:增加一個新產品時,如果你不修改代碼,做不到
 */

/**
 * 汽車工廠
 */
public class CarFactory {
    public static Car getCar(String car) {
        if("五凌".equals(car)) return new WuLing();
        if("特斯拉".equals(car)) return new Tesla();
        return null;
    }

    /**
     * 第二種方式
     * @return
     */
    public static Car getWuLing() {
        return new WuLing();
    }

    public static Car getTesla() {
        return new Tesla();
    }
}

2.4、建立買車類(傳統方法創建對象被註釋了和通過工廠創建對象)

package com.xgp.company.第二種_工廠模式.簡單工廠模式;

/**
 * 買車
 */
public class Consumer {
/*    *//**
     * 傳統的方式
     * @param args
     *//*
    public static void main(String[] args) {
        //弊端:需要瞭解介面和所有的實現類
        Car car1 = new WuLing();
        Car car2 = new Tesla();

        car1.name();
        car2.name();
    }*/

    /**
     * 簡單工廠模式
     * @param args
     */
    public static void main(String[] args) {
        Car car1 = CarFactory.getCar("五凌");
        Car car2 = CarFactory.getCar("特斯拉");

        car1.name();
        car2.name();
    }
}

2.5、缺點:如果要增加一個“大眾”的汽車,還需要修改工廠代碼

package com.xgp.company.第二種_工廠模式.簡單工廠模式;

/**
 * 弊端:增加實現類時需要改工廠類的代碼
 */
public class Dazhong implements Car {
    @Override
    public void name() {
        System.out.println("大眾");
    }
}

2.6、運行結果

五凌巨集觀
特斯拉

2.7、UML類圖

3、工廠方法模式

3.1、建立汽車抽象類

package com.xgp.company.第二種_工廠模式.工廠方法模式;

public interface Car {

    void name();
}

3.2、創建車

創建“五凌”車

package com.xgp.company.第二種_工廠模式.工廠方法模式;

public class WuLing implements Car {
    @Override
    public void name() {
        System.out.println("五凌巨集觀");
    }
}

創建“特斯拉”車

package com.xgp.company.第二種_工廠模式.工廠方法模式;

public class Tesla implements Car {
    @Override
    public void name() {
        System.out.println("特斯拉");
    }
}

3.3、創建汽車工廠的抽象類

package com.xgp.company.第二種_工廠模式.工廠方法模式;

public interface CarFactory {
    Car getCar();
}

3.4、創建汽車工廠

創建製造“五凌”車的汽車工廠

package com.xgp.company.第二種_工廠模式.工廠方法模式;

public class WuLingFactory implements CarFactory {

    @Override
    public Car getCar() {
        return new WuLing();
    }
}

創建製造“特斯拉”車的汽車工廠

package com.xgp.company.第二種_工廠模式.工廠方法模式;

public class TeslaFactory implements CarFactory {
    @Override
    public Car getCar() {
        return new Tesla();
    }
}

3.5、新增一輛“大眾”車

新增一輛“大眾”車

package com.xgp.company.第二種_工廠模式.工廠方法模式;

/**
 * 弊端:增加實現類時需要改工廠類的代碼
 */
public class Dazhong implements Car {
    @Override
    public void name() {
        System.out.println("大眾");
    }
}

新增一輛“大眾”車的汽車工廠

package com.xgp.company.第二種_工廠模式.工廠方法模式;

public class DazhongFactory implements CarFactory {
    @Override
    public Car getCar() {
        return new Dazhong();
    }
}

3.6、創建消費者類

package com.xgp.company.第二種_工廠模式.工廠方法模式;

/**
 * 買車
 */
public class Consumer {
    public static void main(String[] args) {
        Car car1 = new WuLingFactory().getCar();
        Car car2 = new TeslaFactory().getCar();
        Car car3 = new DazhongFactory().getCar();

        car1.name();
        car2.name();
        car3.name();
    }

    //根據設計原則:工廠方法模式
    //更據實際業務:簡單工廠模式
}

3.7、弊端:增加實現類時需要改工廠類的代碼

總結:

根據設計原則:工廠方法模式

更據實際業務:簡單工廠模式

3.8、UML類圖

4、小節

5、抽象工廠模式

5.1、該模式介紹

5.2、UML類圖設計

5.3、創建生產產品種類的抽象類

package com.xgp.company.第二種_工廠模式.抽象工廠模式;

/**
 * 抽象產品工廠
 */
public interface IProductFactory {
    //生產手機
    IPhoneProduct iphoneProduct();

    //生產路由器
    IRouterProduct routerProduct();
}

5.4、創建手機和路由器的抽象介面

手機:

package com.xgp.company.第二種_工廠模式.抽象工廠模式;

/**
 * 手機介面
 */
public interface IPhoneProduct {
    void start();       //開機
    void shutdown();    //關機
    void callup();      //打電話
    void sendSMS();     //發簡訊
}

路由器:

package com.xgp.company.第二種_工廠模式.抽象工廠模式;

/**
 * 路由器產品介面
 */
public interface IRouterProduct {
    void start();       //開機
    void shutdown();    //關機
    void openWifi();    //打開網路
    void setting();     //設置參數
}

5.5、創建小米工廠

package com.xgp.company.第二種_工廠模式.抽象工廠模式;

public class XiaomiFactory implements IProductFactory {
    @Override
    public IPhoneProduct iphoneProduct() {
        return new XiaomiPhone();
    }

    @Override
    public IRouterProduct routerProduct() {
        return new XiaomiRouter();
    }
}

5.6、小米工廠製造小米手機、小米路由器

製造小米手機:

package com.xgp.company.第二種_工廠模式.抽象工廠模式;

/**
 * 小米手機
 */
public class XiaomiPhone implements IPhoneProduct {
    @Override
    public void start() {
        System.out.println("開啟小米手機");
    }

    @Override
    public void shutdown() {
        System.out.println("關閉小米手機");
    }

    @Override
    public void callup() {
        System.out.println("小米打電話");
    }

    @Override
    public void sendSMS() {
        System.out.println("小米發簡訊");
    }
}

製造小米路由器:

package com.xgp.company.第二種_工廠模式.抽象工廠模式;

/**
 * 小米路由器
 */
public class XiaomiRouter implements IRouterProduct {
    @Override
    public void start() {
        System.out.println("開啟小米路由器");
    }

    @Override
    public void shutdown() {
        System.out.println("關閉小米路由器");
    }

    @Override
    public void openWifi() {
        System.out.println("小米網路");
    }

    @Override
    public void setting() {
        System.out.println("小米參數");
    }

}

5.7、創建華為工廠

package com.xgp.company.第二種_工廠模式.抽象工廠模式;

public class HuaweiFactory implements IProductFactory {
    @Override
    public IPhoneProduct iphoneProduct() {
        return new HuaweiPhone();
    }

    @Override
    public IRouterProduct routerProduct() {
        return new HuaweiRouter();
    }
}

5.8、華為工廠製造華為手機、華為路由器

製造華為手機:

package com.xgp.company.第二種_工廠模式.抽象工廠模式;

/**
 * 華為手機
 */
public class HuaweiPhone implements IPhoneProduct {

    @Override
    public void start() {
        System.out.println("開啟華為手機");
    }

    @Override
    public void shutdown() {
        System.out.println("關閉華為手機");
    }

    @Override
    public void callup() {
        System.out.println("華為手機打電話");
    }

    @Override
    public void sendSMS() {
        System.out.println("華為手機發簡訊");
    }
}

製造華為路由器:

package com.xgp.company.第二種_工廠模式.抽象工廠模式;

public class HuaweiRouter implements IRouterProduct {
    @Override
    public void start() {
        System.out.println("開啟華為路由器");
    }

    @Override
    public void shutdown() {
        System.out.println("關閉華為路由器");
    }

    @Override
    public void openWifi() {
        System.out.println("華為網路");
    }

    @Override
    public void setting() {
        System.out.println("華為參數");
    }
}

5.9、根據工廠製造產品

package com.xgp.company.第二種_工廠模式.抽象工廠模式;

public class Client {
    public static void main(String[] args) {
        System.out.println("================小米系列產品=================");
        //小米工廠
        XiaomiFactory xiaomiFactory = new XiaomiFactory();

        //小米手機
        IPhoneProduct iphoneProduct = xiaomiFactory.iphoneProduct();

        iphoneProduct.start();
        iphoneProduct.callup();
        iphoneProduct.sendSMS();
        iphoneProduct.shutdown();

        //小米路由器
        IRouterProduct routerProduct = xiaomiFactory.routerProduct();

        routerProduct.start();
        routerProduct.openWifi();
        routerProduct.setting();
        routerProduct.shutdown();

        System.out.println("================華為系列產品=================");
        //華為工廠
        HuaweiFactory huaweiFactory = new HuaweiFactory();

        //華為手機
        iphoneProduct = huaweiFactory.iphoneProduct();

        iphoneProduct.start();
        iphoneProduct.callup();
        iphoneProduct.sendSMS();
        iphoneProduct.shutdown();

        //華為路由器
        routerProduct = huaweiFactory.routerProduct();

        routerProduct.start();
        routerProduct.openWifi();
        routerProduct.setting();
        routerProduct.shutdown();
    }
}

5.10、運行結果

================小米系列產品=================
開啟小米手機
小米打電話
小米發簡訊
關閉小米手機
開啟小米路由器
小米網路
小米參數
關閉小米路由器
================華為系列產品=================
開啟華為手機
華為手機打電話
華為手機發簡訊
關閉華為手機
開啟華為路由器
華為網路
華為參數
關閉華為路由器

進程完成,退出碼 0

5.11、實際的UML類圖

分析:


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1. Ajax是什麼? 全稱是 asynchronous javascript and xml,是已有技術的組合,主要用來實現客戶端與伺服器端的非同步通信效果(無需重新載入整個網頁的情況下),實現頁面的局部刷新。 通過在後臺與伺服器進行少量數據交換,AJAX 可以使網頁實現非同步更新,用於創建快速動態網 ...
  • 表單是什麼?表單是前端和伺服器做交互的一種機制,表單收集用戶輸入信息,之後發送或者提交給伺服器。用戶在輸入的信息稱之為內容,內容的文本分為普通和密碼型,用戶通過單選框、覆選框、下拉框(也就是下拉菜單)完成內容信息輸入,最後通過提交按鈕發送給伺服器!這裡要講到瀏覽器怎麼發送給伺服器?涉及到http協議... ...
  • 要用面向對象的方式去編程,而不要用面向過程的方式去編程 對象是各種類型的數據的集合,可以是數字、字元串、數組、函數、對象…… 對象中的內容以鍵值對方式進行存儲 對象要賦值給一個變數 var cat={ "name":"喵1", "age":4, "family":["喵爸","喵媽"], "spea ...
  • SPA單頁面應用容器 開源地址: https://github.com/yuzd/Spa 功能介紹 前端應用開發完後打包後自助上傳部署發佈 配合服務端腳本(javascript)實現服務端業務邏輯編寫渲染SSR功能 可以快速回滾到上一個版本 可以設置環境變數供SSR功能使用 服務端腳本提供執行日誌 ...
  • 最近自學到了JS運動部分,自己整理了一些js模板,望採納。 1.支持鏈式運動的模板: 先解釋一下函數中的幾個參數含義: 1)obj: 要操作的對象 2)target: 屬性要到達的目標值 3)attr: 要操作的屬性值 4)callback: 回調函數 註:調用函數時,回調函數可不寫 2.支持完美運 ...
  • 在vue、react等框架大量應用之前,我們需要使用jQuery或者原生js來操作dom寫代碼,在用原生js進行事件綁定時,我們可以應用DOM2級綁定事件的方法,即:元素.addEventListener(),因為相容性,還有: 元素.attachEvent()。所以我們需要封裝成一個方法: fun ...
  • 原文:https://zhuanlan.zhihu.com/p/23987456?refer=study-fe 大部分講 new 的文章會從面向對象的思路講起,但是我始終認為,在解釋一個事物的時候,不應該引入另一個更複雜的事物。 今天我從「省代碼」的角度來講 new。 想象我們在製作一個策略類戰爭游 ...
  • 1.HTML基礎標簽圖片常見代碼形式<img src="圖片路徑地址" alt="屬性名" title="占位符">常見的圖片格式為以下三種:.jpg(圖片有損壓縮,影響畫質)、.png(圖片無損壓縮、容積大、具有透明通道)、.gif(動圖)。圖片路徑地址分為本地圖片和網路圖片,本地圖片中分為絕對路 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...