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

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

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類圖

分析:


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

更多相關文章
  • 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(動圖)。圖片路徑地址分為本地圖片和網路圖片,本地圖片中分為絕對路 ...
一周排行
  • 最近由於疫情緊張,遂在家辦公,在領導的帶領下,學習了一下.Net Core MVC。 一,構建web應用 1.選擇c#-所有平臺-web 找到ASP.NET Core web應用程式 2.項目命名之後轉至如下界面:選擇Web應用程式(模型視圖控制器)。 Ok點擊創建,這個項目的基本框架就生成了。 二 ...
  • 本筆記摘抄自:https://www.cnblogs.com/PatrickLiu/p/7792973.html,記錄一下學習過程以備後續查用。 一、引言 今天我們要講結構型設計模式的第六個模式--享元模式,先從名字上來看,“享元”可以這樣理解--共用“單元”。單元是什麼呢?舉例說明:對於圖形而言就 ...
  • 本筆記摘抄自:https://www.cnblogs.com/PatrickLiu/p/7814004.html,記錄一下學習過程以備後續查用。 一、引言 今天我們要講結構型設計模式的第七個模式,也是結構型設計模式中的最後一個模式--代理模式。先從名字上來看,“代理”可以理解為“代替”,代替“主人” ...
  • 本筆記摘抄自:https://www.cnblogs.com/PatrickLiu/p/7837716.html,記錄一下學習過程以備後續查用。 一、引言 今天我們要講行為型設計模式的第一個模式--模板方法模式,先從名字上來看。“模板方法”理解為有一個方法的名字叫“模板方法”,也可以換個理解方法: ...
  • 本筆記摘抄自:https://www.cnblogs.com/PatrickLiu/p/7873322.html,記錄一下學習過程以備後續查用。 一、引言 今天我們要講行為型設計模式的第二個模式--命令模式,又稱為行動(Action)模式或交易(Transaction)模式,先從名字上來看。“命令模 ...
  • 前面幾章介紹了處理適量適中的圖形內容的最佳方法。通過使用幾何圖形、圖畫和路徑,可以降低2D圖形的開銷。即使正在使用複雜的具有分層效果的組合形狀和漸變畫刷,這種方法也仍然能夠正常得很好。 然而,這樣設計不適合需要渲染大量圖形元素的繪圖密集型應用程式。例如繪圖程式、演示粒子碰撞的物理模型程式或橫向卷軸形 ...
  • Dubbo的服務暴露是一個重要的特性,瞭解其機制很重要。之前有很多人寫了有關的源代碼分析,在本文中不再重新分析。官方文檔中的一篇寫的就很好,本文主要是有關內容進行補充與總結。 傳送門: "服務導出" 為什麼要服務暴露 服務暴露分為遠程暴露和本地暴露。在遠程服務暴露中會將服務信息上傳到註冊中心。這時客 ...
  • 在上一篇文章 Dubbo之服務暴露分析 中介紹了當遠程暴露時,如果有註冊中心,需要在服務暴露後再將服務註冊到註冊中心。該篇將介紹該功能的有關步驟。 註冊的起點 在 方法包含了服務導出,註冊,以及數據訂閱等邏輯。其中服務註冊先調用 方法。 可以看出,服務註冊主要包括兩部分, 獲取註冊中心實例 和 向註 ...
  • 從今天開始,將會逐步介紹關於DUbbo的有關知識。首先先簡單介紹一下DUbbo的整體概述。 概述 Dubbo是SOA(面向服務架構)服務治理方案的核心框架。用於分散式調用,其重點在於分散式的治理。 簡單的來說,可以把它分為四個角色。服務提供方(Provider)、服務消費方(Consumer)、註冊 ...
  • [TOC] python是數據分析的主要工具,它包含的數據結構和數據處理工具的設計讓python在數據分析領域變得十分快捷。它以NumPy為基礎,並對於需要類似 for迴圈 的大量數據處理的問題有非常快捷的數組處理函數。 但是pandas最擅長的領域還是在處理表格型二維以上不同數據類型數據。 基本導 ...
x