深入探析設計模式:工廠模式的三種姿態

深入探析設計模式:工廠模式的三種姿態

  • 1. 簡單工廠模式
    • 1.1 概念
    • 1.2 案例
    • 1.3 優缺點
  • 2. 抽象工廠模式
    • 2.1 概念
    • 2.2 案例:跨品牌手機生產
    • 2.3 優缺點
  • 3. 超級工廠模式
    • 3.1 概念
    • 3.2 案例:動物園游覽
    • 3.3 優缺點
  • 4. 總結

歡迎閱讀本文,今天我們將會深入學習工廠模式,這是一種重要的設計模式,用于創建對象的實例化過程。我們將分析三種工廠模式的用法:簡單工廠模式、抽象工廠模式和超級工廠模式,并通過實際案例幫助您了解如何在實際開發中應用這些模式。

在這里插入圖片描述

1. 簡單工廠模式

1.1 概念

簡單工廠模式(Simple Factory Pattern)是最基礎的工廠模式,它通過一個工廠類根據不同的參數來創建不同類的實例。讓我們通過一個例子來理解簡單工廠模式。

1.2 案例

假設我們有不同類型的汽車:轎車、越野車和卡車。我們可以創建一個汽車工廠,根據用戶的選擇來制造不同類型的汽車。

class CarFactory {public Car createCar(String type) {if ("sedan".equals(type)) {return new SedanCar();} else if ("suv".equals(type)) {return new SuvCar();} else if ("truck".equals(type)) {return new TruckCar();} else {throw new IllegalArgumentException("Unknown car type");}}
}interface Car {void drive();
}class SedanCar implements Car {public void drive() {System.out.println("Driving a sedan car");}
}class SuvCar implements Car {public void drive() {System.out.println("Driving an SUV car");}
}class TruckCar implements Car {public void drive() {System.out.println("Driving a truck car");}
}public class Main {public static void main(String[] args) {CarFactory carFactory = new CarFactory();Car sedan = carFactory.createCar("sedan");Car suv = carFactory.createCar("suv");Car truck = carFactory.createCar("truck");sedan.drive();suv.drive();truck.drive();}
}

這個案例中,CarFactory根據用戶的選擇來創建不同類型的汽車實例。這是最簡單的工廠模式,但它的缺點是新增汽車類型時,需要修改工廠類。

1.3 優缺點

  • 優點
    1. 簡單易用:簡單工廠模式的實現相對簡單,適用于創建單一類型的對象。
    2. 封裝創建邏輯:工廠類封裝了對象的創建邏輯,客戶端只需提供參數即可獲得所需對象。
    3. 解耦:客戶端與具體產品類之間解耦,降低客戶端與具體類的依賴性。
  • 缺點
    1. 不易擴展:當需要新增產品時,需要修改工廠類的代碼,違反了開閉原則。
    2. 代碼維護難:隨著產品種類增加,共產類的代碼會變得臃腫,難以維護。
    3. 違背單一職責原則:工廠類負責了對象的創建和邏輯判斷,導致職責不清晰。

2. 抽象工廠模式

2.1 概念

抽象工廠模式(Abstract Factory Pattern)是對簡單工廠模式的進一步抽象,它提供了一個抽象的工廠接口,每個具體的工廠類實現這個接口以創建一系列相關或依賴對象的實例。讓我們通過一個例子理解抽象工廠模式。

2.2 案例:跨品牌手機生產

假設我們要生產手機,分為不同品牌和型號。我們可以創建一個抽象的工廠接口,不同的品牌工廠實現這個接口來生產不同型號的手機。

interface PhoneFactory {SmartPhone createSmartPhone();FeaturePhone createFeaturePhone();
}class AppleFactory implements PhoneFactory {public SmartPhone createSmartPhone() {return new IPhone();}public FeaturePhone createFeaturePhone() {return new IPod();}
}class SamsungFactory implements PhoneFactory {public SmartPhone createSmartPhone() {return new Galaxy();}public FeaturePhone createFeaturePhone() {return new OldPhone();}
}interface SmartPhone {void makeCall();void sendText();
}interface FeaturePhone {void makeCall();
}class IPhone implements SmartPhone {public void makeCall() {System.out.println("Calling from iPhone");}public void sendText() {System.out.println("Sending text from iPhone");}
}class Galaxy implements SmartPhone {public void makeCall() {System.out.println("Calling from Galaxy");}public void sendText() {System.out.println("Sending text from Galaxy");}
}class IPod implements FeaturePhone {public void makeCall() {System.out.println("Calling from iPod");}
}class OldPhone implements FeaturePhone {public void makeCall() {System.out.println("Calling from old phone");}
}public class Main {public static void main(String[] args) {PhoneFactory appleFactory = new AppleFactory();SmartPhone iphone = appleFactory.createSmartPhone();FeaturePhone ipod = appleFactory.createFeaturePhone();PhoneFactory samsungFactory = new SamsungFactory();SmartPhone galaxy = samsungFactory.createSmartPhone();FeaturePhone oldPhone = samsungFactory.createFeaturePhone();iphone.makeCall();ipod.makeCall();galaxy.makeCall();oldPhone.makeCall();}
}

在這個案例中,PhoneFactory是抽象工廠接口,不同的品牌工廠類如AppleFactorySamsungFactory實現了這個接口。每個工廠類都可以創建不同品牌手機的實例。

2.3 優缺點

  • 優點
    1. 封裝產品族創建邏輯:抽象工廠模式將一系列相關的產品組成一個產品族,工廠類負責創建整個產品族的對象。
    2. 滿足開閉原則:新增產品時只需要擴展抽象工廠及其具體子類,不需要修改已有代碼。
    3. 解耦產品類和客戶端:客戶端通過工廠接口而不是具體類來創建對象,降低了依賴。
  • 缺點
    1. 不易擴展新產品等級:當需要新增產品等級時,需要修改所有具體工廠類的代碼。
    2. 復雜性增加:隨著產品族和產品等級的增加,工廠和產品類的數量會增加,導致負責性提高。

3. 超級工廠模式

3.1 概念

超級工廠模式是將多個工廠模式結合在一起,形成一個層次結構的工廠模式。它可以根據不同的條件選擇合適的子工廠來創建對象。讓我們通過一個例子了解超級工廠模式。

3.2 案例:動物園游覽

假設我們要構建一個動物園游覽系統,需要創建各種動物的實例。我們可以使用超級工廠模式來管理不同種類的工廠,每個工廠負責創建一類動物。

// 動物接口
interface Animal {void makeSound();
}// 具體動物
class Lion implements Animal {public void makeSound() {System.out.println("Lion is roaring");}
}class Elephant implements Animal {public void makeSound() {System.out.println("Elephant is trumpeting");}
}class Dolphin implements Animal {public void makeSound() {System.out.println("Dolphin is squeaking");}
}// 動物工廠接口
interface AnimalFactory {Animal createAnimal();
}// 具體動物工廠
class LionFactory implements AnimalFactory {public Animal createAnimal() {return new Lion();}
}class ElephantFactory implements AnimalFactory {public Animal createAnimal() {return new Elephant();}
}class DolphinFactory implements AnimalFactory {public Animal createAnimal() {return new Dolphin();}
}public class Main {public static void main(String[] args) {AnimalFactory lionFactory = new LionFactory();AnimalFactory elephantFactory = new ElephantFactory();AnimalFactory dolphinFactory = new DolphinFactory();Animal lion = lionFactory.createAnimal();Animal elephant = elephantFactory.createAnimal();Animal dolphin = dolphinFactory.createAnimal();lion.makeSound();elephant.makeSound();dolphin.makeSound();}
}

在這個案例中,AnimalFactory是超級工廠接口,每個具體的動物工廠類如LionFactoryElephantFactoryDolphinFactory都實現了這個接口。通過不同的工廠,我們可以創建不同種類的動物。

3.3 優缺點

  • 優點
    1. 更高層次的封裝:超級工廠模式將多個工廠模式結合在一起,提供更高層次的封裝和抽象。
    2. 根據條件選擇:根據不同條件選擇合適的子工廠來創建對象,增加了靈活性和可擴展性。
    3. 滿足開閉原則:當新增工廠或產品時,不需要修改已有代碼,符合開閉原則。
  • 缺點
    1. 復雜性增加:超級工廠模式會引入更多的工廠類,可能會增加系統的復雜性。
    2. 不同工廠間的耦合:超級工廠模式可能會導致不同工廠之間的耦合,影響系統的維護和擴展。

4. 總結

工廠模式是面向對象設計中的重要模式之一,它能夠將對象的創建和使用分離,提高代碼的靈活性和可維護性。通過簡單工廠模式、抽象工廠模式和超級工廠模式,我們可以根據不同的需求來選擇合適的模式來創建對象。在實際開發中,根據具體情況選擇合適的工廠模式可以使代碼更加模塊化、可擴展和易于維護。

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

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

相關文章

go入門實踐四-go實現一個簡單的tcp-socks5代理服務

文章目錄 前言socks協議簡介go實現一個簡單的socks5代理運行與壓測抓包驗證 前言 SOCKS是一種網絡傳輸協議,主要用于客戶端與外網服務器之間通訊的中間傳遞。協議在應用層和傳輸層之間。 本文使用先了解socks協議。然后實現一個socks5的tcp代理服務端。最后&#…

英語詞法——代詞

代詞是用來代替名詞、起名詞作用的短語、分句和句子的詞。英語中代詞根據其意義和作用可分為九類:人稱代詞、物主代詞、反身代詞、相互代詞、指示代詞、疑問代詞、不定代詞、關系代詞和連接代詞。 第一節 人稱代詞 一、人稱代詞的形式和用法 人稱代詞單數復數第一人稱第二人…

【ARM 嵌入式 編譯系列 4 -- GCC 編譯屬性 __read_mostly 詳細介紹】

文章目錄 __read_mostly 介紹__read_mostly 在 linux 中的使用.data.read_mostly 介紹 __read_mostly 介紹 __read_mostly 是一個在Linux內核編程中用到的宏定義,這是一個gcc編譯器的屬性,用于告訴編譯器此變量主要用于讀取,很少進行寫入&am…

MYSQL中用字符串2022-07去匹配Date類型大于2022-07-01并小于2022-07-31

正文 需求上,是有個日期字符串,例如2022-07,代表著年月。數據庫中表對于這個字段存的是年月日,例如:2022-07-15。 我希望的是:獲取到2022-07-01到2022-07-31,之間的數據,條件是&…

21款美規奔馳GLS450更換中規高配主機,漢化操作更簡單

很多平行進口的奔馳GLS都有這么一個問題,原車的地圖在國內定位不了,語音交互功能也識別不了中文,原廠記錄儀也減少了,使用起來也是很不方便的。 可以實現以下功能: ①中國地圖 ②語音小助手(你好&#xf…

【BASH】回顧與知識點梳理(二十六)

【BASH】回顧與知識點梳理 二十六 二十六. 二十一至二十五章知識點總結及練習26.1 總結26.2 模擬26.3 簡答題 該系列目錄 --> 【BASH】回顧與知識點梳理(目錄) 二十六. 二十一至二十五章知識點總結及練習 26.1 總結 Linux 操作系統上面&#xff0c…

unittest單元測試

當你在編寫測試用例時,可以使用Python內置的unittest模塊來進行單元測試。下面是一個逐步指南,幫助你理解如何編寫和運行基本的單元測試。 導入必要的模塊: 首先,你需要導入unittest模塊和需要測試的模塊(例如&#xf…

運維監控學習筆記8

在服務器端,我們添加了nginx-server的主機: 在解決Error問題的過程中,我還通過zabbix_get這個命令進行了測試,發現是沒有的,后來確認是在web頁面配置的過程中,我輸錯了密碼。 yum install zabbix-getzabbi…

uniapp-原生地圖截屏返回base64-進行畫板編輯功能

一、場景 vue寫uniapp打包安卓包,實現原生地圖截屏(andirod同事做的)-畫板編輯功能 實現效果: 二、邏輯步驟簡略 1. 由 原生地圖nvue部分,回調返回 地圖截屏生成的base64 數據, 2. 通過 uni插件市場 im…

《圖解HTTP》——HTTP協議詳解

一、HTTP協議概述 HTTP是一個屬于應用層的面向對象協議,由于其簡捷、快速的方式,適用于分布式超媒體信息系統。它于1990年提出,經過幾年的使用與發展,得到不斷地完善和擴展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP…

muduo 29 異步日志

目錄 Muduo雙緩沖異步日志模型: 異步日志實現: 為什么要實現非阻塞的日志

SQL 語句解析過程詳解

SQL 語句解析過程詳解: 1.輸入SQL語句 2.詞法分析------flex 使用詞法分析器(由Flex生成)將 SQL 語句分解為一個個單詞,這些單詞被稱為“標記“。標記包括關鍵字、標識符、運算符、分隔符等。 2.1 flex 原…

【CSS 布局】水平垂直方向居中

【CSS 布局】水平垂直方向居中 單行元素 <div class"container"><div class"item"></div> </div>方式一&#xff1a;relative 和 absolute .container {position: relative;height: 400px;border: 1px solid #ccc;.item {posit…

20個互聯網用戶Python數據分析項目

這篇文章給大家整理了20個互聯網用戶數據分析的項目。所有收錄的項目&#xff0c;進行了嚴格的篩選&#xff0c;標準有二&#xff1a; 1.有解說性文字&#xff0c;大家能知道每一步在干嘛&#xff0c;新手友好 2.數據集公開&#xff0c;保證大家可以在原文的基礎上自行探索 更…

[保研/考研機試] KY96 Fibonacci 上海交通大學復試上機題 C++實現

題目鏈接&#xff1a; KY96 Fibonacci https://www.nowcoder.com/share/jump/437195121692000803047 描述 The Fibonacci Numbers{0,1,1,2,3,5,8,13,21,34,55...} are defined by the recurrence: F00 F11 FnFn-1Fn-2,n>2 Write a program to calculate the Fibon…

【STM32】FreeRTOS互斥量學習

互斥量&#xff08;Mutex&#xff09; 互斥量又稱互斥信號量&#xff08;本質也是一種信號量&#xff0c;不具備傳遞數據功能&#xff09;&#xff0c;是一種特殊的二值信號量&#xff0c;它和信號量不同的是&#xff0c;它支持互斥量所有權、遞歸訪問以及防止優先級翻轉的特性…

人文景區有必要做VR云游嗎?如何滿足游客出行需求?

VR云游在旅游行業中的應用正在快速增長&#xff0c;為游客帶來沉浸式體驗的同時&#xff0c;也為文旅景區提供了新的營銷方式。很多人說VR全景展示是虛假的&#xff0c;比不上真實的景區觸感&#xff0c;人文景區真的有必要做VR云游嗎&#xff1f;我的答案是很有必要。 如果你認…

【跟小嘉學 Rust 編程】十二、構建一個命令行程序

系列文章目錄 【跟小嘉學 Rust 編程】一、Rust 編程基礎 【跟小嘉學 Rust 編程】二、Rust 包管理工具使用 【跟小嘉學 Rust 編程】三、Rust 的基本程序概念 【跟小嘉學 Rust 編程】四、理解 Rust 的所有權概念 【跟小嘉學 Rust 編程】五、使用結構體關聯結構化數據 【跟小嘉學…

【Pytroch】基于K鄰近算法的數據分類預測(Excel可直接替換數據)

【Pytroch】基于K鄰近算法的數據分類預測&#xff08;Excel可直接替換數據&#xff09; 1.模型原理2.數學公式3.文件結構4.Excel數據5.下載地址6.完整代碼7.運行結果 1.模型原理 K最近鄰&#xff08;K-Nearest Neighbors&#xff0c;簡稱KNN&#xff09;是一種簡單但常用的機器…

Redis基礎學習

目錄 第一章、Redis數據庫的下載和安裝1.1&#xff09;nosql數據庫和 Redis 介紹1.2&#xff09;Windows中下載安裝Redis數據庫1.3&#xff09;Linux中安裝Redis數據庫1.4&#xff09;Linux中啟動redis1.5&#xff09;Linux中關閉redis 第二章、三種Redis客戶端連接Redis數據庫…