iOS 工廠模式

iOS 工廠模式

文章目錄

  • iOS 工廠模式
    • 前言
    • 工廠模式
      • 簡單工廠
        • 案例
        • 場景分析
        • 蘋果類
          • 優點
          • 缺點
        • 小結
      • 工廠模式
          • 客戶端調用
          • **優點**
          • **缺點**
      • 抽象工廠模式
        • 三個模式對比

前言

筆者之前學習了有關于設計模式的六大原則,之前簡單了解過這個工廠模式,今天主要是重新學習一下這個模式,正式系統性的學習一下這個模式

工廠模式

工廠模式就是指我們在創建對象的時候不會對客戶端暴露創建邏輯,并且是通過使用一個共同的接口來指向新創建的對象,在OC中最經典的例子是下面這個:

UIButton* button = [UIButton buttonWithType:UIButtonTypeSystem];

這里我們并不處理創建邏輯,而是通過我們需要什么就會創建出對應需求的一個button

工廠模式主要分成三類:

  • 簡單工廠: 簡單工廠不是一個模式,而是一種編程習慣,提供一個創建對象實例的功能,而無需關系他的具體實現.被創建的類型可以是接口,抽象類,具體類
  • 工廠模式:要依賴抽象,不要依賴具體
  • 抽象工廠模式:提供一個創建一系列相關或者互相依賴的接口,而無需依賴具體類

簡單工廠

簡單工廠模式(Simple Factory Pattern):專門定義一個類(工廠類)來負責創建其他類的實例。可以根據創建方法的參數來返回不同類的實例,被創建的實例通常都具有共同的父類。

就相當于一個工廠添加新的產品.

總結來說,就是將各式各樣if-else的判斷由業務層,放到了工廠類里面

在這里插入圖片描述

簡單工廠模式的結果比較簡單:

  • 工廠:工廠負責創建所有產品實例的邏輯
  • 具體產品:工廠鎖創建的所有產品對象類,它以自己的方式來實現其共同父類聲明的接口
案例

一個商店中售賣不同品牌的手機:華為手機,小米手機,蘋果手機

場景分析
  • 工廠:Phone, 手機工廠類
  • 具體產品:華為手機,小米手機,蘋果手機

在這里插入圖片描述

- (Factory *)sellPhone:(NSString *)type {if ([type isEqualToString:@"ApplePhone"]) {ApplePhone* phone = [[ApplePhone alloc] init];return phone;} else if ([type isEqualToString:@"HuaWeiPhone"]) {HuaWeiPhone* phone = [[HuaWeiPhone alloc] init];return phone;} else if ([type isEqualToString:@"RedmiPhone"]) {RedmiPhone* phone = [[RedmiPhone alloc] init];return phone;}return nil;
}
蘋果類
- (void)sellPhone{NSLog(@"售賣蘋果手機");
}

其他類也類似

我們可以把具體創建的信息放在某一個產品自己類中.這樣把它封裝好,然后我們客戶端調用的時候就可以直接調用最外層的工廠方法:

- (Factory *)sellPhone:(NSString *)type // 外層只用調用這個方法就可以獲得對應的實例

這樣我們就可以把創建處理的內容放在對應的類中去,可以減少對于外部工廠的修改,讓邏輯更緊密,邏輯封裝的更好

優點

客戶端只需要給工廠類傳入一個正確的(約定好的)參數,就可以獲取你所需要的對象,而不需要知道其創建細節,一定程度上減少系統的耦合

缺點

如果我們要是在添加Cell,那么我們就需要修改FactoryCell的方法,違反了開閉原則。

簡單來說就是違反了依賴倒置原則,讓高層組件client依賴于底層組件。違反這個原則的后果就是一旦底層組件改動,那么高層組件也就必須改動,違反了開閉原則。

小結

什么時候使用簡單工廠

  • 想完全封裝隔離具體實現,讓外部只能通過抽象類或者接口來操作,在上面的例子中,就是只操作factory,而不操作具體類,此時可以使用簡單工廠,讓客戶端通過簡單工廠來選擇創建具體的類,不需要創建的具體過程
  • 想把創建對象的職責集中管理,一個簡單啊工廠可以創建許多相關或者不相關的對象,所以可以把對象的創建集中到簡單工廠中進行管理

工廠模式

工廠方法模式(Factory Method Pattern)又稱為工廠模式,工廠父類負責定義創建產品對象的公共接口,而工廠子類則負責生成具體的產品對象,即通過不同的工廠子類來創建不同的產品對象。

不同的工廠生成不同的子類.通過協議來實現一個繼承的效果,這樣可以統一調用協議方法,然后不同的工廠重寫協議函數實現對應的一個產品的創建

這里的適用場景其實與簡單工廠類似,都是創建數據行為都比較類似的對象,但是和簡單工廠不同的是,在工廠方法模式中,因為常化鋼建對象的責任交給了抽象工廠的子類,因此客戶端需要知道其所需的產品對應的工廠子類,而不是簡單工廠中的參數

工廠模式主要包括:

  • 抽象工廠:抽象工廠負責聲明具體工廠的創建產品的接口
  • 具體工廠:具體工廠負責創建產品
  • 具體產品:具體產品是工廠所創建的所有產品對象類,它用自己的方式來實現共同父類聲明的接口

在這里插入圖片描述

這對賣手機的案例我們新的UML圖

在這里插入圖片描述

通過工廠模式定義我們知道,工廠模式主要是把對象的創建延遲到子類執行

創建工廠的一個抽象類

@protocol PhoneMakeProtocol <NSObject>+ (id<PhoneProtocol>)sellPhone:(NSInteger)type; // <PhoneProtocol> 這個協議是意味著這個類可以被認為是我們的手機類@end

然后讓工廠實例:

 // 蘋果手機的工廠類@interface iPhoneFactory : NSObject <PhoneProtocol>@end@implementation iPhoneFactory- (id<PhoneProtocol>)sellPhone:(NSInteger)type {return [[ApplePhone alloc] init];}@end

產品的抽象類:

 @interface ApplePhone : NSObject <PhoneProtocol>- (void)sellPhone;@end@implementation ApplePhone
- (void)sellPhone{NSLog(@"售賣蘋果手機");
}@end

這樣客戶端就可以根據我們不同的工廠獲取不同的一個iPhone的內容

客戶端調用
 factory = [iPhoneFactory new];
ApplePhone* phone = = [factory sellPhone:11];
[phone sellphone];
優點

更容易擴展新版本,如果需要加入新的實現,只需要擴展一個新類,然后繼承抽象接口實現工廠方法即可。遵循了開閉原則

缺點

具體產品和工廠方法耦合,因為在工廠方法中需要創建具體實例,所以它們會耦合

抽象工廠模式

抽象工廠模式:提供一個創建一系列相關或相互依賴對象的接口,而無須指定它們具體的類。

有時候我們需要一個工廠可以提供多個產品對象,而不是單一的產品對象。比如系統中有多于一個的產品族,而每次只使用其中某一產品族,屬于同一個產品族的產品將在一起使用

在這里插入圖片描述

接著看新的業務:

在這里插入圖片描述

仔細看一下這六個產品的特點,我們可以把這它們劃分在三個產品族里面:

  • 1、蘋果產品族:蘋果手機,蘋果電腦
  • 2、小米產品族:小米手機,小米電腦
  • 3、華為產品族:華為手機,華為電腦

這樣我們只需要添加艾一個新的方法就變成了一個抽象工廠

三個模式對比
  1. 當單一類型產品比較少的時候,用簡單工廠模式
  2. 單一產品各種定制比較多的時候,用工廠模式
  3. 多種類型產品的時候,使用抽象工廠模式
  • 抽象工廠模式和工廠模式 工廠模式針對單獨產品的創建,而抽象工廠注重一個產品系列的創建。如果產品系列只有一個產品的 話,那么抽象工廠就退換到工廠模式了。在抽象工廠中使用工廠方法來提供具體實現,這個時候他們聯 合使用。
  • 工廠模式和簡單工廠 兩者非常類似,都是用來做選擇實現的。不同的地方在于簡單工廠在自身就做了選擇實現。而工廠模式 則是把實現延遲到子類執行。如果把工廠方法的選擇實現直接在父類實現,那么此時就退化為簡單工廠 模式了。
  • 簡單工廠和抽象工廠 簡單工廠用于做選擇實現,每個產品的實現之間沒有依賴關系。而抽象工廠實現的一個產品系列,相互 之間有關聯。這是他們的區別

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

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

相關文章

【機器學習】工具入門:飛牛啟動Dify Ollama Deepseek

很久沒有更新文章了,最近正好需要研究一些機器學習的東西&#xff0c;打算研究一下 difyOllama 以下是基于FN 的dify本地化部署&#xff0c;當然這也可能是全網唯一的飛牛部署dify手冊 部署 官方手冊&#xff1a;https://docs.dify.ai/en/getting-started/install-self-hos…

安卓A15系統實現修改鎖屏界面默認壁紙功能

最近遇到一個A15系統項目&#xff0c;客戶要求修改鎖屏界面的默認壁紙&#xff0c;客戶提供了一張壁紙圖片&#xff0c;但是從A15系統的源代碼查看時才知道谷歌已經去掉了相關的代碼&#xff0c;已經不支持了&#xff0c;A13和A14系統好像是支持的&#xff0c;A15系統的Wallpap…

從理論到實戰:模糊邏輯算法的深度解析與應用實踐

從理論到實戰&#xff1a;模糊邏輯算法的深度解析與應用實踐 一、模糊邏輯的核心概念與數學基礎 模糊邏輯&#xff08;Fuzzy Logic&#xff09;是一種處理不確定性的數學工具&#xff0c;其核心思想是將傳統布爾邏輯的“非黑即白”擴展為連續的隸屬度函數。例如&#xff0c;在…

正向代理與反向代理區別及應用

正向代理和反向代理是兩種常見的代理服務器類型&#xff0c;它們在網絡架構中扮演不同角色&#xff0c;核心區別在于代理對象和使用場景。 1. 正向代理&#xff08;Forward Proxy&#xff09; 定義&#xff1a;正向代理是客戶端&#xff08;如瀏覽器&#xff09;主動配置的代理…

OpenCV CUDA模塊中逐元素操作------邏輯運算

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 比較、AND、OR、NOT等。這類操作可用于創建基于條件的掩碼&#xff0c;這對于圖像分割或特征選擇非常有用。 主要函數 1. 按位與 (cv::cuda::b…

一臺入網的電腦有6要素, 機器名,mac,ip,俺碼,網關,dns,分別有什么作用

一臺入網的電腦需要配置的 六大網絡要素&#xff08;機器名、MAC地址、IP地址、子網掩碼、網關、DNS&#xff09;各自承擔不同的關鍵作用&#xff0c;共同確保設備能正確通信和訪問網絡資源。以下是它們的詳細功能解析&#xff1a; 1. 機器名&#xff08;主機名&#xff09; 作…

MySQL之儲存引擎和視圖

一、儲存引擎 基本介紹&#xff1a; 1、MySQL的表類型由儲存引擎(Storage Engines)決定&#xff0c;主要包括MyISAM、innoDB、Memory等。 2、MySQL數據表主要支持六種類型&#xff0c;分別是&#xff1a;CSV、Memory、ARCHIVE、MRG_MYISAN、MYISAM、InnoBDB。 3、這六種又分…

【Spring Boot后端組件】mybatis-plus使用

文章目錄 mybatis-plus使用一、依賴引入二、添加相關配置項三、功能詳解1.自增主鍵2.邏輯刪除3.操作時間自動填充4.其他字段自動填充5.分頁查詢6.自定義動態查詢7.代碼生成器8.代碼生成器(自定義模板) mybatis-plus使用 一、依賴引入 pom.xml文件 <?xml version"1.…

docker compose 啟動指定的 service

使用 Docker Compose 啟動指定服務 要在 Docker Compose 中啟動特定的服務而不是所有服務&#xff0c;可以使用以下命令&#xff1a; docker compose up [服務名] 基本用法 啟動單個服務&#xff1a; docker compose up service_name 啟動多個指定服務&#xff1a; docker …

wordcount程序

### 在 IntelliJ IDEA 中編寫和運行 Spark WordCount 程序 要使用 IntelliJ IDEA 編寫并運行 Spark 的 WordCount 程序&#xff0c;需按照以下流程逐步完成環境配置、代碼編寫以及任務提交。 --- #### 1. **安裝與配置 IntelliJ IDEA** 確保已正確安裝 IntelliJ IDEA&#x…

SmartETL函數式組件的設計與應用

SmartETL框架主要采用了面向對象的設計思想&#xff0c;將ETL過程中的處理邏輯抽象為Loader和Processor&#xff08;對應loader模塊和iterator模塊&#xff09;&#xff0c;所有流程組件需要繼承或實現DataProvider&#xff08;iter方法&#xff09;或JsonIterator&#xff08;…

鴻蒙AI開發:10-多模態大模型與原子化服務的集成

鴻蒙AI開發&#xff1a;10-多模態大模型與原子化服務的集成 在鴻蒙生態中&#xff0c;多模態大模型與原子化服務的集成是一個重要課題。本文將介紹如何在鴻蒙平臺上進行多模態大模型與原子化服務的集成&#xff0c;以及相關的技術細節和實際案例。 鴻蒙AI開發概述 什么是鴻蒙AI…

python打卡day29@浙大疏錦行

知識點回顧 類的裝飾器裝飾器思想的進一步理解&#xff1a;外部修改、動態類方法的定義&#xff1a;內部定義和外部定義 作業&#xff1a;復習類和函數的知識點&#xff0c;寫下自己過去29天的學習心得&#xff0c;如對函數和類的理解&#xff0c;對python這門工具的理解等&…

20250516使用TF卡將NanoPi NEO core開發板出廠的Ubuntu core22.04.3系統降級到Ubuntu core16.04.2

20250516使用TF卡將NanoPi NEO core開發板出廠的Ubuntu core22.04.3系統降級到Ubuntu core16.04.2 2025/5/16 10:58 緣起&#xff1a;NanoPi NEO core核心板出廠預制的OS操作系統為Ubuntu core22.04.3系統。 【雖然是友善之臂提供的最新的系統&#xff0c;但是缺少很多用用程序…

密西根大學新作——LightEMMA:自動駕駛中輕量級端到端多模態模型

導讀 目前將自動駕駛與視覺語言模型&#xff08;VLMs&#xff09;結合的研究越來越火熱&#xff0c;VLMs已經證明了其對自動駕駛的重要作用。本文引入了一種用于自動駕駛的輕量級端到端多模態模型LightEMMA&#xff0c;它能夠集成和評估當前的商業和開源模型&#xff0c;以研究…

框架之下再看HTTP請求對接后端method

在當今的軟件開發領域&#xff0c;各類框架涌現&#xff0c;極大地提升了開發效率。以 Java 開發為例&#xff0c;Spring 框架不斷演進&#xff0c;Spring Boot 更是簡化到只需引入 Maven 包&#xff0c;添加諸如SpringBootApplication、RestController等注解&#xff0c;就能輕…

Vue+Go 自定義打字素材的打字網站

Typing_Key_Board 這是一個基于Vue 3和Go語言的自定義素材打字練習網站&#xff0c;靈感來源于常用字打字練習&#xff0c;解決了大多數網站無法自定義打字素材的問題。在 Typing_Key_Board (簡稱TKB)中&#xff0c;用戶可以自定義打字素材進行練習&#xff0c;在復習代碼的同…

開源物聯網平臺(OpenRemote)

在物聯網技術蓬勃發展的當下&#xff0c;OpenRemote作為一款強大的開源物聯網平臺&#xff0c;正逐漸在多個領域嶄露頭角。尤其是在智能能源管理領域&#xff0c;它為微電網和分布式能源網絡提供了全面且靈活的數據集成與管理方案&#xff0c;展現出獨特的優勢。 OpenRemote提供…

Spring Security與SaToken的對比與優缺點分析

Spring Security與SaToken對比分析 一、框架定位 Spring Security 企業級安全解決方案&#xff0c;深度集成Spring生態提供完整的安全控制鏈&#xff08;認證、授權、會話管理、攻擊防護&#xff09;適合中大型分布式系統 SaToken 輕量級權限認證框架&#xff0c;專注Token會…

每日一道leetcode(新學數據結構版)

208. 實現 Trie (前綴樹) - 力扣&#xff08;LeetCode&#xff09; 題目 Trie&#xff08;發音類似 "try"&#xff09;或者說 前綴樹 是一種樹形數據結構&#xff0c;用于高效地存儲和檢索字符串數據集中的鍵。這一數據結構有相當多的應用情景&#xff0c;例如自動…