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
  • 1. 說明 /* Performs operations on System.String instances that contain file or directory path information. These operations are performed in a cross-pla ...
  • 視頻地址:【WebApi+Vue3從0到1搭建《許可權管理系統》系列視頻:搭建JWT系統鑒權-嗶哩嗶哩】 https://b23.tv/R6cOcDO qq群:801913255 一、在appsettings.json中設置鑒權屬性 /*jwt鑒權*/ "JwtSetting": { "Issuer" ...
  • 引言 集成測試可在包含應用支持基礎結構(如資料庫、文件系統和網路)的級別上確保應用組件功能正常。 ASP.NET Core 通過將單元測試框架與測試 Web 主機和記憶體中測試伺服器結合使用來支持集成測試。 簡介 集成測試與單元測試相比,能夠在更廣泛的級別上評估應用的組件,確認多個組件一起工作以生成預 ...
  • 在.NET Emit編程中,我們探討了運算操作指令的重要性和應用。這些指令包括各種數學運算、位操作和比較操作,能夠在動態生成的代碼中實現對數據的處理和操作。通過這些指令,開發人員可以靈活地進行算術運算、邏輯運算和比較操作,從而實現各種複雜的演算法和邏輯......本篇之後,將進入第七部分:實戰項目 ...
  • 前言 多表頭表格是一個常見的業務需求,然而WPF中卻沒有預設實現這個功能,得益於WPF強大的控制項模板設計,我們可以通過修改控制項模板的方式自己實現它。 一、需求分析 下圖為一個典型的統計表格,統計1-12月的數據。 此時我們有一個需求,需要將月份按季度劃分,以便能夠直觀地看到季度統計數據,以下為該需求 ...
  • 如何將 ASP.NET Core MVC 項目的視圖分離到另一個項目 在當下這個年代 SPA 已是主流,人們早已忘記了 MVC 以及 Razor 的故事。但是在某些場景下 SSR 還是有意想不到效果。比如某些靜態頁面,比如追求首屏載入速度的時候。最近在項目中回歸傳統效果還是不錯。 有的時候我們希望將 ...
  • System.AggregateException: 發生一個或多個錯誤。 > Microsoft.WebTools.Shared.Exceptions.WebToolsException: 生成失敗。檢查輸出視窗瞭解更多詳細信息。 內部異常堆棧跟蹤的結尾 > (內部異常 #0) Microsoft ...
  • 引言 在上一章節我們實戰了在Asp.Net Core中的項目實戰,這一章節講解一下如何測試Asp.Net Core的中間件。 TestServer 還記得我們在集成測試中提供的TestServer嗎? TestServer 是由 Microsoft.AspNetCore.TestHost 包提供的。 ...
  • 在發現結果為真的WHEN子句時,CASE表達式的真假值判斷會終止,剩餘的WHEN子句會被忽略: CASE WHEN col_1 IN ('a', 'b') THEN '第一' WHEN col_1 IN ('a') THEN '第二' ELSE '其他' END 註意: 統一各分支返回的數據類型. ...
  • 在C#編程世界中,語法的精妙之處往往體現在那些看似微小卻極具影響力的符號與結構之中。其中,“_ =” 這一組合突然出現還真不知道什麼意思。本文將深入剖析“_ =” 的含義、工作原理及其在實際編程中的廣泛應用,揭示其作為C#語法奇兵的重要角色。 一、下劃線 _:神秘的棄元符號 下劃線 _ 在C#中並非 ...