大白話 設計模式之虛擬工廠

来源:http://www.cnblogs.com/j2eeDevelper/archive/2016/02/19/5201654.html
-Advertisement-
Play Games

什麼是設計模式 現在聊起來java設計,那就必然要聊聊設計模式,幾年前我剛入行的時候,總是聽人說起設計模式,在當時的我看來,那是多麼高大上的東西啊,以至於有種遙不可及的感覺,如今自己做java也好幾個年頭了,今天來談談如今我眼中的設計模式 說白了,設計模式就是前輩高人總結出來的一套編寫好代碼的方法,


什麼是設計模式

現在聊起來java設計,那就必然要聊聊設計模式,幾年前我剛入行的時候,總是聽人說起設計模式,在當時的我看來,那是多麼高大上的東西啊,以至於有種遙不可及的感覺,如今自己做java也好幾個年頭了,今天來談談如今我眼中的設計模式

說白了,設計模式就是前輩高人總結出來的一套編寫好代碼的方法,就好比是面向對象的武林秘籍,凡夫俗子如果能夠運用自如也立馬能夠成為武林高手.

那什麼又是虛擬工廠呢?

在聊虛擬工廠之前,我們先舉個例子:

 我們把漢堡快餐店抽象到面向對象的世界里,那我們要怎麼做呢? 首先我們建造一個快餐店的模型,我們可以在快餐店裡點漢堡,點飲料

public interface FastFoodStore {
/**點漢堡 */
Hamburger orderHamburger();

/**點飲料 */
Drink orderDrink();
}

 有了快餐店,我們不能忘記最重要的東西--食物, 於是我們有了漢堡和飲料的模型:

public interface Drink {
/** */
public void desc();
}

public interface Hamburger {
/** */
void desc();
}

 那麼你喜歡吃哪家快餐呢? 我們有很多種選擇,比如說KFC,

public class KFC implements FastFoodStore {
/**點KFC的漢堡 */
public Hamburger orderHamburger() {
    
    return new KFCHamburger();
}

/**點KFC的飲料 */
public Drink orderDrink() {
    return new KFCDrink();
}

}

比如說McDonald:

public class Mcdonald implements FastFoodStore {
/**點McDonald漢堡 */
public Hamburger orderHamburger() {
    return new McHamburger();
}

/**點McDonald飲料 */
public Drink orderDrink() {
    return  new McDrink();
}
}

當然每個店的口味可不一樣,對於KFC,它有自己的漢堡和飲料:

public class KFCDrink implements Drink {
/** */
public void desc() {
    System.out.println("KFC飲料");
}
}

public class KFCHamburger implements Hamburger {
/** */
public void desc() {
    System.out.println("KFC漢堡");
}
}

McDonald 也一樣:

public class McDrink implements Drink {
/** */
public void desc() {
    System.out.println("Mcdonald飲料");
}
}

public class McHamburger implements Hamburger {
/** */
public void desc() {
    System.out.println("McDonald漢堡");
}
}

糾結了半天,我打算兩家都吃一遍:

public static void main(String[] args) {
    FastFoodStore food ;
    Hamburger hamburger;
    Drink drink;
    //先去KFC
    food = new KFC();
    //點餐
    hamburger = food.orderHamburger();
    drink = food.orderDrink();
    //看看賣相怎麼樣
    hamburger.desc();
    drink.desc();

    //再去McDonald
    food = new Mcdonald();
    //點餐
    hamburger = food.orderHamburger();
    drink = food.orderDrink();
    //再看看怎麼樣
    hamburger.desc();
    drink.desc();
}

結果

KFC漢堡
KFC飲料
McDonald漢堡
Mcdonald飲料

其實這就是抽象工廠,引用專業的定義就是 為創建一組相關或相互依賴的對象提供一個介面,而且無需指定它們的具體類

在這個例子中,一組相關的東西就是指漢堡和飲料,我們有KFC和McDonald兩個工廠為我們製造這些食物,我們不用關心漢堡和飲料到底是怎麼製造的,我們只要知道去哪家店能吃到什麼就好,不是嗎?


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

-Advertisement-
Play Games
更多相關文章
  • 在工作中我們經常會遇到格式轉換的問題,有的時候是將JSON轉換成DataTable、DataSet或是List等,也有可能將DataTable、DataSet或是List轉換成JSON的,抽了點時間把這些方法整合了一下,希望對大家有所幫助,如果有什麼問題請指出來,共同探討。 代碼: 1 using
  • 使用 HttpRequest 對象 HttpRequest 對象描述的是一個正在被處理的 HTTP 請求。下表列舉了 HttpRequest 中的屬性,它們提供了當前請求的相關信息(HttpRequest 類定義了一些方法和屬性,我們會逐步講解當中的一些屬性)。 表 1 – HttpRequest
  • https://msdn.microsoft.com/zh-cn/library/system.text.regularexpressions.regex(v=vs.110).aspx /// <summary> /// /// </summary> /// <param name="sender"
  • 引言--面向介面所處的設計模式中的位置。 其實,我認為Java/C#比C++高級的其中一個原因是,它對面向介面編程的支持。不要誤解,並不是說C++不支持面向介面編程,而是說C++的語法中沒有這種天然的機制。 面向對象之於面向過程,面向介面之於面向實現。但基本上,面向介面和麵向實現都基於面向對象的模式
  • Atitit.pdf 預覽 轉換html attilax總結 1. Swf flash還是html1 2. pdf2htmlEX1 3. iText 5.5.0 發佈,Java 的 PDF 操作類庫1 4. PdfBox1 5. other2 5.1. ICEpdf2 5.2. xpdf用過2 5.
  • 定義 適配器模式(Adapter):將一個類的介面轉換成客戶希望的另外一個介面 那通俗點來說,啥是適配器呢,大家都知道港版的iphone的充電器,是不能直接在內地使用的,需要一個轉換器才能使用,那麼這個 轉換器就是所謂的適配器 . 那麼適配器能夠給我們帶來什麼好處呢? 使用港版iPhone的同學都知
  • 裝飾模式(Decorator) 裝飾模式又名包裝(Wrapper)模式。 裝飾模式以對客戶端透明的方式擴展對象的功能,是繼承關係的一個替代方案。 裝飾模式通過創建一個包裝對象,也就是裝飾,來包裹真實的對象。 裝飾模式以對客戶端透明的方式動態地給一個對象附加上更多的責任。換言之,客戶端並不會覺得對象在
  • 1、簡介 Laravel Excel 在 Laravel 5 中集成 PHPOffice 套件中的 PHPExcel ,從而方便我們以優雅的、富有表現力的代碼實現Excel/CSV文件的導入和 導出 。 該項目的GitHub地址是: https://github.com/Maatwebsite/La
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...