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(動圖)。圖片路徑地址分為本地圖片和網路圖片,本地圖片中分為絕對路 ...
一周排行
  • 比如要拆分“呵呵呵90909086676喝喝999”,下麵當type=0返回的是中文字元串“呵呵呵,喝喝”,type=1返回的是數字字元串“90909086676,999”, private string GetStrings(string str,int type=0) { IList<strin ...
  • Swagger一個優秀的Api介面文檔生成工具。Swagger可以可以動態生成Api介面文檔,有效的降低前後端人員關於Api介面的溝通成本,促進項目高效開發。 1、使用NuGet安裝最新的包:Swashbuckle.AspNetCore。 2、編輯項目文件(NetCoreTemplate.Web.c ...
  • 2020 年 7 月 30 日, 由.NET基金會和微軟 將舉辦一個線上和為期一天的活動,包括 微軟 .NET 團隊的演講者以及社區的演講者。本次線上大會 專註.NET框架構建微服務,演講者分享構建和部署雲原生應用程式的最佳實踐、模式、提示和技巧。有關更多信息和隨時瞭解情況:https://focu... ...
  • #abp框架Excel導出——基於vue #1.技術棧 ##1.1 前端採用vue,官方提供 UI套件用的是iview ##1.2 後臺是abp——aspnetboilerplate 即abp v1,https://github.com/aspnetboilerplate/aspnetboilerp ...
  • 前言 本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理。 作者:碧茂大數據 PS:如有需要Python學習資料的小伙伴可以加下方的群去找免費管理員領取 input()輸入 Python提供了 input() 內置函數從標準輸入讀入一 ...
  • 從12年到20年,python以肉眼可見的趨勢超過了java,成為了當今It界人人皆知的編程語言。 python為什麼這麼火? 網路編程語言搜索指數 適合初學者 Python具有語法簡單、語句清晰的特點,這就讓初學者在學習階段可以把精力集中在編程對象和思維方法上。 大佬都在用 Google,YouT ...
  • 在社會上存在一種普遍的對培訓機構的學生一種歧視的現象,具體表現在,比如:當你去公司面試的時候,一旦你說了你是培訓機構出來的,那麼基本上你就涼了,那麼你瞞著不說,然後又通過了面試成功入職,但是以後一旦在公司被髮現有培訓經歷,可能會面臨被降薪,甚至被辭退,培訓機構出來的學生,在用人單位眼裡就是能力低下的 ...
  • from typing import List# 這道題看了大佬寫的代碼,經過自己的理解寫出來了。# 從最外圍的四周找有沒有為O的,如果有的話就進入深搜函數,然後深搜遍歷# 判斷上下左右的位置是否為Oclass Solution: def solve(self, board: List[List[s ...
  • import requests; import re; import os; # 1.請求網頁 header = { "user-agent":'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, li ...
  • import requests; import re; import os; import parsel; 1.請求網頁 header = { "user-agent":'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537. ...