工廠模式(簡單工廠模式+工廠模式)

工廠模式的目的就是將對象的創建過程隱藏起來,從而達到很高的靈活性,工廠模式分為三類:

  • 簡單工廠模式
  • 工廠方法模式
  • 抽象工廠模式

在沒有工廠模式的時候就是,客戶需要一輛馬車,需要客戶親自去創建一輛馬車,然后拿來用。

  • 在簡單工廠模式下,客戶可以通過工廠獲得一輛馬車,需要下單后,告訴馬車的型號,然后工廠可以根據型號創建馬車。
  • 在工廠方法模式下:客戶想要一輛馬車,需要指明型號創建。比如325i的bmw,和530li,根據各自325i的工廠和530li的工廠創建,每個工廠創建一個系列。即具體的工廠只能創建出一個具體的產品。
  • 在抽象工廠模式下:客戶想要一輛帶空調的寶馬車,于是開始創建帶空調的寶馬車,不需要自己創建安裝。

不適用工廠模式

如果不使用工廠,用戶將自己創建寶馬車,具體UML圖和代碼如下:

public class BMW320 {public BMW320(){System.out.println("制造-->BMW320");}
}public class BMW523 {public BMW523(){System.out.println("制造-->BMW523");}
}public class Customer {public static void main(String[] args) {BMW320 bmw320 = new BMW320();BMW523 bmw523 = new BMW523();}
}

用戶需要知道怎么創建一款車,這樣子客戶和車就緊密耦合在一起了,為了降低耦合,就出現了簡單工廠模式,把創建寶馬的操作細節都放到了工廠里,而客戶直接使用工廠的創建方法,傳入想要的寶馬車型號就行了,而不必去知道創建的細節。

簡單工廠模式:

核心是:創建一個對象的接口,然后根據接口創建具體的實現,將創建與本身的業務邏輯分開,降低耦合度。

1.UML圖:

  • 工廠類角色: 該模式的核心,用來創建產品,含有一定的商業邏輯和判斷邏輯

  • 抽象產品角色:它一般是具體產品繼承的父類或者實現的接口。

  • 具體產品角色:工廠類所創建的對象就是此角色的實例。在java中由一個具體類實現。

2.代碼實現:

產品類

abstract class BMW {public BMW(){}
}public class BMW320 extends BMW {public BMW320() {System.out.println("制造-->BMW320");}
}
public class BMW523 extends BMW{public BMW523(){System.out.println("制造-->BMW523");}
}

工廠類

public class Factory {public BMW createBMW(int type) {switch (type) {case 320:return new BMW320();case 523:return new BMW523();default:break;}return null;}
}

用戶類

public class Customer {public static void main(String[] args) {Factory factory = new Factory();BMW bmw320 = factory.createBMW(320);BMW bmw523 = factory.createBMW(523);}
}
3.優點

?????????簡單工廠模式提供了專門的工廠類用于創建對象,實現類對象的創建和使用的職責分離,客戶端不需要知道所創建的具體產品類的類名以及創建過程,只需要具體產品所對應的參數即可。通過引入配置文件,可以在不修改任何客戶端代碼的情況下更換和增加新的具體產品類,在一定程度上提高了系統的靈活性。

4.缺點

????????在于不符合“開閉原則”,每次添加新產品就需要修改工廠類。在產品類型較多時,有可能造成工廠邏輯過于復雜,不利于系統的擴展維護,并且工廠類集中了所有產品創建邏輯,一旦不能正常工作,整個系統都要受到影響。

為了解決簡單工廠模式的問題,出現了工廠方法模式。

工廠模式

????????工廠方法模式將工廠抽象化,并定義一個創建對象的接口。每增加新產品,只需增加該產品以及對應的具體實現工廠類,由具體工廠類決定要實例化的產品是哪個,將對象的創建與實例化延遲到子類,這樣工廠的設計就符合“開閉原則”了,擴展時不必去修改原來的代碼。在使用時,用于只需知道產品對應的具體工廠,不需要關注具體的創建過程,甚至不需要知道具體產品類的類名,當我們選擇哪個具體工廠時,就已經決定了實際創建的產品是哪個了。

????????但缺點在于,每增加一個產品都需要增加一個具體產品類和實現工廠類,使得系統中類的個數成倍增加,在一定程度上增加了系統的復雜度,同時也增加了系統具體類的依賴。

1.UML圖

抽象工廠 AbstractFactory: 工廠方法模式的核心,是具體工廠角色必須實現的接口或者必須繼承的父類,在 Java 中它由抽象類或者接口來實現。具體工廠 Factory:被應用程序調用以創建具體產品的對象,含有和具體業務邏輯有關的代碼抽象產品 AbstractProduct:是具體產品繼承的父類或實現的接口,在 Java 中一般有抽象類或者接口來實現。 具體產品 Product:具體工廠角色所創建的對象就是此角色的實例。
代碼實現

產品類

abstract class BMW {public BMW(){}
}
public class BMW320 extends BMW {public BMW320() {System.out.println("制造-->BMW320");}
}
public class BMW523 extends BMW{public BMW523(){System.out.println("制造-->BMW523");}
}

工廠類;

interface FactoryBMW {BMW createBMW();
}public class FactoryBMW320 implements FactoryBMW{@Overridepublic BMW320 createBMW() {return new BMW320();}}
public class FactoryBMW523 implements FactoryBMW {@Overridepublic BMW523 createBMW() {return new BMW523();}
}

用戶類

public class Customer {public static void main(String[] args) {FactoryBMW320 factoryBMW320 = new FactoryBMW320();BMW320 bmw320 = factoryBMW320.createBMW();FactoryBMW523 factoryBMW523 = new FactoryBMW523();BMW523 bmw523 = factoryBMW523.createBMW();}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/13511.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/13511.shtml
英文地址,請注明出處:http://en.pswp.cn/web/13511.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PDF之Blend Mode(混合模式)BM(對應OFD的BlendMode)

Blend Mode(混合模式)用于定義對象與背景或其他對象之間的顏色混合方式。PDF支持多種混合模式,常見的混合模式包括: Normal:正常混合模式,將對象顏色直接疊加在背景上。 Multiply:乘法混合模式…

經驗分享:C++ error:‘syscall’ was not declared in this scope

明明已經加了頭文件 #include <sys/syscall.h>#define gettid() syscall(__NR_gettid)但是依舊不能使用 syscall() 函數&#xff0c; 檢查源碼后&#xff1a; sys/syscall.h 內部表示&#xff0c;他封裝了 打開對應的 syscall.h 文件內部依舊沒有 syscall()函數的聲明…

使用docker+jenkins構建前端項目發布到nginx

1.準備環境 為了方便公司開發優化代碼&#xff0c;不需要反復地將項目包發送給運維部署&#xff0c;我們對開發環境的前端項目利用jenkinsCI/CD進行自動化部署 需要兩臺服務器 一臺jenkins 一臺發布服務器,這里發布服務器 我直接使用開發環境的服務器 將admin界面與云計算展示…

全棧實現發送驗證碼注冊賬號 全棧開發之路——全棧篇(3)

全棧開發一條龍——前端篇 第一篇&#xff1a;框架確定、ide設置與項目創建 第二篇&#xff1a;介紹項目文件意義、組件結構與導入以及setup的引入。 第三篇&#xff1a;setup語法&#xff0c;設置響應式數據。 第四篇&#xff1a;數據綁定、計算屬性和watch監視 第五篇 : 組件…

基于JAVA的Dubbo 實現的各種限流算法

在基于 Java 的 Dubbo 實現中&#xff0c;限流&#xff08;Rate Limiting&#xff09;同樣是一個關鍵的需求。Dubbo 是阿里巴巴開源的一款高性能 Java RPC 框架&#xff0c;廣泛應用于分布式服務架構中。實現限流可以幫助服務在高并發場景下保持穩定性和可靠性。以下是幾種常見…

Linux進程調度與切換、環境變量

文章目錄 Linux優先級Linux的調度與切換**進程切換**&#xff1a;**進程調度**&#xff1a;優先級活動隊列過期隊列active指針和expired指針 環境變量main函數參數 int main(int argc, char *argv[], char *envp[]) 環境變量環境變量和本地變量echo查看單個環境變量的方法expor…

藍牙模塊在無人機 ID識別、標準制定發揮的作用及其應用優勢和面臨的挑戰

隨著科技的飛速發展&#xff0c;無人機已經廣泛應用于航拍、農業、救援、物流等多個領域。而在無人機的通信與控制系統中&#xff0c;藍牙模塊扮演著重要的角色。本文將探討藍牙模塊在無人機Remote ID識別和標準制定執行中發揮的作用&#xff0c;并分析其應用優勢和面臨的挑戰。…

裝飾器模式在JS中的應用

裝飾器模式在JavaScript中的應用主要是通過修飾函數或類來添加額外的功能或行為。 在ES6中&#xff0c;裝飾器模式可以通過使用語法糖來實現。我們可以將裝飾器應用于函數、類、方法或屬性等。下面是一些在JavaScript中使用裝飾器模式的示例&#xff1a; 修飾函數&#xff1a…

2.Spring中用到的設計模式

Spring框架中使用了多種設計模式來構建其強大且靈活的功能&#xff0c;這里舉例說明Spring中的一些功能使用到的設計模式。 工廠模式&#xff1a;Spring容器本質是一個大工廠&#xff0c;使用工廠模式通過BeanFactory和ApplicationContext這兩個核心接口來創建和管理bean對象。…

Java讀取串口及端口調試

本篇主要講述使用Java對串口進行讀取和發送操作 準備 在項目中導入第三方Jar包 Jar包已經在資源中綁定&#xff0c;或者去官網上自行下載jSerialComm 注意當前jar包是配合JDK1.8環境使用&#xff0c;如果是1.8以下程序將直接中斷 安裝虛擬串口的軟件 Configure Virtual Seri…

一款功能強大的安卓虛擬機應用——VMOS Pro使用分享

前段時間我剛剛分享一個WeChat平板模塊能夠允許用戶自由修改系統設置&#xff0c;讓你的Android備用手機煥發新生&#xff0c;實現手機PAD化&#xff0c;實現兩臺設備同時登錄微信號。今天我分享的這個相比WeChat更為簡單&#xff0c;因為它可以通過虛擬機的方式進行多種androi…

分類和品牌關聯

文章目錄 1.數據庫表設計1.多表關聯設計2.創建表 2.使用renren-generator生成CRUD1.基本配置檢查1.generator.properties2.application.yml 2.生成代碼1.進入localhost:81生成代碼2.將main目錄覆蓋sunliving-commodity模塊的main目錄 3.代碼檢查1.注釋掉CategoryBrandRelationC…

Tencent : TBDS簡介

Tencent TBDS&#xff08;Tencent Big Data Suite&#xff09;是騰訊公司推出的大數據處理套件&#xff0c;它基于騰訊多年海量數據處理經驗&#xff0c;依托云原生技術和泛Hadoop生態開源技術&#xff0c;為用戶提供可靠、安全、易用的大數據處理平臺。 TBDS可以在公有云、私…

JavaWeb基礎(HTML,CSS,JS)

這些知識用了三四天左右學完&#xff0c;因為是JavaWeb&#xff0c;并不是前端&#xff0c;所以只是夠用&#xff0c;不是深入&#xff0c;但是這確實是學校一個學期交的東西&#xff08;JavaWeb課程&#xff09;。 總結一下網頁分為三部分&#xff1a;HTML(內容結構),CSS&…

MySql--SQL語言

目錄 SQl---DDL 結構定義 創建、刪除 數據庫 代碼 運行 設計表 數據類型 整數 浮點數 主鍵 約束 主鍵自增長 默認值 字段注釋 創建、刪除 表 代碼 運行 代碼 代碼 運行 SQL---DML 數據操縱 插入數據 代碼 運行 代碼 運行 代碼 運行 代碼 …

【實戰教程】使用Spring AOP和自定義注解監控接口調用

一、背景 隨著項目的長期運行和迭代&#xff0c;積累的功能日益繁多&#xff0c;但并非所有功能都能得到用戶的頻繁使用或實際上根本無人問津。 為了提高系統性能和代碼質量&#xff0c;我們往往需要對那些不常用的功能進行下線處理。 那么&#xff0c;該下線哪些功能呢&…

貪心算法: 單調遞增的數字

參考資料&#xff1a;代碼隨想錄 題目鏈接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 倒序遍歷每個數字&#xff0c;遇到前一個比后一個大的就減一&#xff0c;最后統一把后面幾位置為9 String str n"";char[] chars str.toCharArray();int flag c…

docker部署kafka實戰

目錄 一、部署kafaka、zookeeper 二、測試信息發送與接收 三、kafka進階 一、部署kafaka、zookeeper 請提前安裝docker、docker-compose 安裝docker&#xff1a;docker--安裝docker-ce-CSDN博客 安裝docker-compose&#xff1a; 安裝docker-compose_安裝 docker-compose-CSD…

云下到云上,麗迅物流如何實現數據庫降本50% | OceanBase案例

在2024年3月20日的首場OceanBase數據庫城市行活動中&#xff0c;專注于物流及供應鏈解決方案的麗迅物流的架構師陽磊&#xff0c;圍繞“OB Cloud在麗迅物流的實踐”這一主題&#xff0c;進行了精彩的演講。本文為此次演講的內容回顧。 在麗迅物流&#xff08;Lesoon Logistics…

小demo - 列表hide or not (含代碼)

直接上代碼 <!DOCTYPE html> <html><head><style>.menu {width: 220px;height: 800px;border: 1px solid #dddddd;}.item {cursor: pointer;}.menu .header {padding: 10px 5px;background-color: goldenrod;}.menu .content a {display: block;paddi…