java設計模式之工廠設計模式(Factory)

来源:http://www.cnblogs.com/gulang-jx/archive/2017/09/06/7482582.html
-Advertisement-
Play Games

設計模式根據使用類型可以分為三種:1、 創建模式: Factory (工廠模式)、 Singleton (單態)、 Builder ( (建造者模式)、 Prototype ( (原型模式)、工廠方法模式。 2、 結構模式: Flyweight ( (共用模式)、 Bridge ( (橋模式)、 D ...


 

 

 

 

 

 

設計模式根據使用類型可以分為三種:
1、 創建模式: Factory (工廠模式)、 Singleton (單態)、 Builder ( (建造者模式)、 Prototype ( (原型模式)、工廠方法模式。

2、 結構模式: Flyweight ( (共用模式)、 Bridge ( (橋模式)、 Decorator ( (裝飾模式)、 Composite ( (組合模式)、 Adapter (適配器模式)、 Proxy ( (代理模式)、 Facade ( (外觀模式)。

3、 行為模式: Iterator (迭代模式) 、Template ( (模板模式)、 Chainof Responsibility ( ( 責 任 鏈 模 式 ) 、 Memento ( ( 紀 念 品 模 式 ) 、Mediator ( (中介模式)、 Interpreter ( (解釋器模式)、

  Strategy (策略模式)、 State 、 Observer ( (觀察者模式)、 Visitor ( (訪問模式)、Command ( (命令模式)。

 

一、工廠模式(Factory)

    工廠模式是在我們日常開發過程中使用頻率非常高的一種設計模式,其定義:Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses(定義一個創建對象的介面,讓子類決定實例化哪個具體的類,並且使類的實例化放到子類中去).簡單的來說工廠模式就是就創建對象的時候類似於工廠一樣根據用戶的不同需求去生產不同的產品,從而避免了客戶每需要一種新的產品就需要一個專門的公司去生產(即需要去new 不同的對象)

 

  簡單工廠模式(Simple Factory):具體代碼鏈接

 

    場景:有兩種角色的人(老師、學生),不適使用工廠模式的時候需要分別去new這兩種類型的對象,使用工廠模式之後只需要在工廠類中根據不同的特性分別去創建不同的對象

    優點:

      1、實現了對責任的分割,對象的創建都在工廠內完成避免了客戶端去創建產品

      2、客戶端只需要知道創建的產品名而不必關心具體的產品的類名

      3、可以通過引入配置文件的方式在不修改客戶端代碼的前提下更換和增加新的實體產品

    缺點:

      1、所有的對象的創建都在工廠類完成,一旦工廠類出現異常整個系統都要受到影響

      2、會增加系統中類的個數,增加了系統的複雜度

      3、系統擴展性差,在新增加了產品就必須修改工廠類的代碼

    Person類:

        

     工廠類:

        

    學生的實現類:

      

    老師的實現類:

        

    消費者類:

      

    

  工廠方法(Factory Method):代碼鏈接

    工廠方法模式和簡單工廠模式相比,抽象了工廠角色和產品角色,並將每個具體類的實例化放到了子類當中去了

    場景:現有兩種角色的人(老師、學生)都需要參加考試這項活動,但是因為角色的不同在這項活動中的動作也不同(學生參加考試,老師監考)

    

    優點:

        1、用戶值只需要關心產品對應的工廠,無需關鍵創建細節

        2、該模式的多態性設計使得工廠可以自主確定創建何種產品對象,而創建的細節是封裝在實體工廠的內部

        3、加入新產品時無需修改抽象工廠和抽象產品,只需要添加一個實體工廠和一個實體的產品類即可,符合ocp原則

    缺點:

        1、在增加新產品時需要編寫新的實體產品類以及與之對應的實體工廠類,在一定成都上增加了系統的複雜度,給整個系統帶來額外的開銷

        2、在客戶端中使用了抽象層定義,增加了系統的抽象性和理解難度,而且實現時使用到了反射,一定成都上增加了系統實現的難度

 

    抽象產品類:

      

    具體實現類:

      

 

      

    抽象工廠類:

      

     工廠實現類:

      

    消費者類:

      

   抽象工廠(Abstract Factory):代碼鏈接

    場景:現需要生產兩款手機(iPhone 7和華為P10)

    優點:

        1、隔離了具體類的生成,使用戶不需要關心實體產品什麼時候被創建了

        2、當一個抽象產品的多個對象(例如華為P系列手機中的P8、P9、p10)設計成實現同一個抽象產品時,能夠保證客戶端只使用同一種產品

    缺點:

        1、添加新的產品時難以擴展抽象工廠

 

 

    抽象工廠類:

        

        

        

 

 

    實體工廠類:

      

    抽象產品類:

      

      

    實體產品類:

      

      

    消費者類:

      

   總結:

      工廠設計模式的使用主要時為了降低整個系統模塊之間的耦合成都,增加系統的可擴展性,在新增或修改功能時不修改或儘量少的修改原有的代碼,使得後期的系統維護變得更加簡單

 


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

-Advertisement-
Play Games
更多相關文章
  • 概述 Java集合框架由Java類庫的一系列介面、抽象類以及具體實現類組成。我們這裡所說的集合就是把一組對象組織到一起,然後再根據不同的需求操縱這些數據。集合類型就是容納這些對象的一個容器。也就是說,最基本的集合特性就是把一組對象放一起集中管理。根據集合中是否允許有重覆的對象、對象組織在一起是否按某 ...
  • 1 // MARK: 1.斷言 assert,參數如果為ture則繼續,否則拋出異常 2 let number = 3 3 4 //第一個參數為判斷條件,第二各參數為條件不滿足時的列印信息 5 assert(number >= 3,"number 不大於 3") 6 7 //如果斷言被處罰(numb... ...
  • 團隊更換新框架。新的業務全部使用新的框架,甚至是新的資料庫 Mysql。 這邊之前一直是使用oracle,各種訂單號、流水號、批次號啥的,都是直接使用oracle的sequence提供的數字序列號。現在資料庫更換成Mysql了,顯然以前的老方法不能適用了。 需要新寫一個: 分散式場景使用 滿足一定的 ...
  • 例1:y'=ry(1-y/K) y(0)=2 對應的R代碼為: library(deSolve)#parameters and initial valuesr<-1K<-10yini<-2#the function derivs<-function(t,y,parms){ return(list(r ...
  • package test; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.Timer;... ...
  • 怎樣學習才能從一名Java初級程式員成長為一名合格的架構師,或者說一名合格的架構師應該有怎樣的技術知識體系,這是不僅一個剛剛踏入職場的初級程式員也是工作三五年之後開始迷茫的老程式員經常會問到的問題。希望這篇文章會是你看到過的最全面最權威的回答。 一: 編程基礎 不管是C還是C++,不管是Java還是 ...
  • 有的時候需要根據要查詢的參數動態的拼接SQL語句 常用標簽: - if:字元判斷 - choose【when...otherwise】:分支選擇 - trim【where,set】:字元串截取,其中where標簽封裝查詢條件,set標簽封裝修改條件 - foreach: if案例 1)在Employ ...
  • 一。概念 提供一個創建一系列相關或相互依賴對像的介面,而無需指定它們具體的類。 二。模式動機 這一系列對像之間是相互依賴的,相當於一個產品族 三。模式的結構 通過上圖我們可以清楚的看到抽像工廠模式包括以下4個角色: 1.抽像工廠角色(AbstractFactory):抽像工廠模式的核心,與具體的商業 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...