【設計模式 01】簡單工廠模式(Simple factory pattern)

簡單工廠模式

可以根據參數的不同返回不同類的實例

參考:

  • CSDN|簡單工廠模式

簡單工廠通過傳給工廠類的參數的不同,返回不同的對象,包括三部分組成:

  1. 具體的”產品“
  2. 工廠類(實例化并返回”產品“)
  3. 客戶端(使用”產品“)

為什么使用簡單工廠:

  1. ”產品“的創建過程可能很復雜,涉及到多個不同類之間的依賴,通過簡單工廠將創建過程隱藏在工廠類中,一方面減輕了客戶端使用該產品的難度,另一方面也防止了客戶端錯誤創建產品造成的安全問題。
  2. 將產品的生產和消費過程分離開,這樣如果要有了一個新的產品,只需要把它加入到工廠類中,客戶端需要時工廠類就會返回給它,否則的話,每次添加一個新的產品,都需要修改客戶端代碼,違反開閉原則。

簡單工廠的缺點:

  1. 系統過度依賴工廠類,工廠類作為一個”上帝類“,負責創建客戶端需要的所有對象,導致一旦工廠類出錯,整個系統就會崩潰。
  2. 如果”產品類“特別多,工廠類中就會有很多個分支,造成工廠類異常龐大,難以維護。
  3. 每次添加新的產品都要修改工廠類,從工廠類的角度看違反了”開閉原則“,也不利于系統拓展。
  4. 工廠方法一般是靜態方法,不利于繼承。

適用場景

  1. 工廠類負責創建的對象比較少:由于創建的對象較少,不會造成工廠方法中的業務邏輯太過復雜。

  2. 客戶端只知道傳入工廠類的參數,對于如何創建對象不關心:客戶端既不需要關心創建細節,甚至連類名都不需要記住,只需要知道類型所對應的參數。

例:

如果需要獲取不同的手機對象,就可以使用簡單工廠,具體的手機對象依賴于CPU, Camera等,通過簡單工廠的封裝,客戶端獲取 Phone 對象時就不需要了解具體的 ”生產過程“了.

實例化CPU, Camera 等配件時,也應該使用簡單工廠。

UTOOLS1589370322613.png
package pers.junebao.simple_factory;import pers.junebao.simple_factory.fitting.*;
import pers.junebao.simple_factory.phone.Honor;
import pers.junebao.simple_factory.phone.OnePlus;
import pers.junebao.simple_factory.phone.Phone;public class PhoneFactory {/*** 一個用來產生 Phone 對象的工廠方法* @param name 根據 name 產生不同的 Phone 的子類對象* @return 返回實例化后的對象,name 不匹配返回 null*/public static Phone getPhone(String name) {if(name.toLowerCase().equals("oneplus")){// TODO:使用簡單工廠重構CPU cpu = new Qualcomm();Camera camera = new Sony();return new OnePlus(cpu, camera);} else if (name.toLowerCase().equals("honor")) {CPU cpu = new Kirin();Camera camera = new Leica();return new Honor(cpu, camera);} else {return null;}}
}
package pers.junebao.simple_factory;import pers.junebao.simple_factory.phone.Phone;public class Consumer {public static void main(String[] args) {Phone phone = PhoneFactory.getPhone("Honor");assert phone != null;phone.printConfig();}
}

GitHub | 完整代碼

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

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

相關文章

[Hadoop]MapReduce多路徑輸入與多個輸入

1. 多路徑輸入 FileInputFormat是所有使用文件作為其數據源的 InputFormat 實現的基類,它的主要作用是指出作業的輸入文件位置。因為作業的輸入被設定為一組路徑, 這對指定作業輸入提供了很強的靈活性。FileInputFormat 提供了四種靜態方法來設定 Job 的…

pvrect r語言 聚類_R語言實現KEGG通路富集可視化

用過KEGG的朋友應該都很熟悉里面的通路地圖。你是否想過如果自己可以控制通路圖將自己的基因繪制在一個通路圖中,那么今天給大家介紹一個新推出的Bioconductor軟件包pathview。這個包可以進行KEGG富集分析。首先,我們不耐煩的介紹下Bioconductor包的安裝…

【設計模式 02】策略模式( Strategy)

策略模式 參考: CSDN | 策略模式百家號 | 策略模式 如果某個系統需要不同的算法(如超市收銀的優惠算法),那么可以把這些算法獨立出來,使之之間可以相互替換,這種模式叫做策略模式,它同樣具有三個…

PL/SQL復合變量

復合變量可以將不同數據類型的多個值存儲在一個單元中。由于復合類型可以由用戶自己根據需要定義其結構,所以復合數據類型也稱為自定義數據類型。在PL/SQL中,使用%TYPE聲明的變量類型與數據表中字段的數據類型相同,當數據表中字段數據類型修改…

Android中使用am命令實現在命令行啟動程序詳解

在Android中,除了從界面上啟動程序之外,還可以從命令行啟動程序,使用的是命令行工具am. 復制代碼代碼如下:usage: am [subcommand] [options] start an Activity: am start [-D] -D: enable debugging send a broadcast Intent: am br…

用Visual Studio 2019連接 WSL來編譯調試C/C++項目

因為有作業要在Linux環境下寫,用虛擬機直接卡成PPT,VS code又不會調試,就搞一下VS 2019吧。 環境 windows 10 WSL(Ubuntu 18.04.4) Visual Studio Community 2019 Linux 里要有C/C環境(gcc等)VS要有 適用于 Linux…

node.js Websocket消息推送---GoEasy

Goeasy, 它是一款第三方推送服務平臺,使用它的API可以輕松搞定實時推送!個人感覺goeasy推送更穩定,推送速度快,代碼簡單易懂上手快瀏覽器兼容性:GoEasy推送支持websocket 和polling兩種連接方式,從而可以支…

git 移動分支指針_理解git 中的HEAD指針branch指針

HEAD指針使用git checkout 來移動HEAD指針,移動的對象可以是分支指針也可以是快照。HEAD指針可以指向快照也可以指向branch。當指向branch時提交后會和branch指針一起向后移動,當不指向branch提交時時則會在一個detached狀態。分支(branch)指針使用git b…

應用程序域

好文鏈接 使用.NET建立的可執行程序 .exe,并沒有直接承載到進程當中,而是承載到應用程序域(AppDomain)當中。應用程序域是.NET引入的一個新概念,它比進程所占用的資源要少,可以被看作是一個輕量級的進程。 …

【設計模式 03】裝飾模式——俄羅斯套娃?

裝飾模式(俄羅斯套娃?) 裝飾模式:動態的給某些對象添加額外的功能 參考: 簡書 | 裝飾模式 博客園 | 簡說設計模式——裝飾模式 博客園 | 裝飾器模式 Decorator 結構型 設計模式 (十) 什么是裝飾模式 裝飾模式也叫裝飾器模式,p…

系統移植的四大步驟

最近在學習系統移植的相關知識,在學習和調試過程中,發現了很多問題,也解決了很多問題,但總是對于我們的開發結果有一種莫名其妙的感覺,糾其原因,主要對于我們的開發環境沒有一個深刻的認識,有時…

bem什么意思_bem是什么意思_bem的翻譯_音標_讀音_用法_例句_愛詞霸在線詞典

全部Methods Three different concentrations of the n - butanol extract of MOH ( BEM ) : 0.038 g L ~ ( - 1 ), 0.11 g L ~ ( - 1 ) and 0.34 g L ~ ( - 1 ) were prepared.巴戟天醇提取物 ( BEM ) 配成含生藥0.038gL~ ( -1)、0.11gL~ ( -1 ) 、 0.34gL~ ( -1 ) 三種濃度…

display:flex

flex:彈性布局 常用屬性介紹: flex-direction: column (設置主容器主軸方向) flex-flow: row wrap (第一個參數為flex-direction,第二個為flex-wrap) align-items: flex-start (設…

Linux(Ubuntu 19.10)下 Qt5 連接 MySQL(QMYSQL driver not loaded)

Linux(Ubuntu 19.10)下 Qt5 連接 MySQL 安裝好 MySQL 和 Qt Qt 連接 MySQL 的代碼 QSqlDatabase dQSqlDatabase::addDatabase("QMYSQL");//加載mysql驅動,這個字符串是固定的 d.setHostName("127.0.0.1"); d.setDatabas…

華為消息推送 有透傳通道嗎_求解在推送用透傳消息-使用廠商通道(我用的是基座測試) 用手機測試出現了“clientId離線”問題...

// #ifdef APP-PLUS// uni.showModal({// title: 提示,// content: 您的用戶在其它的app登錄,如果有問題,請修改密碼或重新登錄!,// cancelText:"修改密碼",// confirmText:"好的",// success: function (res) {// if (r…

oneuijs/You-Dont-Need-jQuery

oneuijs/You-Dont-Need-jQuery https://github.com/oneuijs/You-Dont-Need-jQuery/blob/master/README.zh-CN.mdYou Dont Need jQuery 前端發展很快,現代瀏覽器原生 API 已經足夠好用。我們并不需要為了操作 DOM、Event 等再學習一下 jQuery 的 API。同時由于 React…

Wpf 數據綁定簡介、實例1

簡介:1.WPF綁定使用的源屬性必須是依賴項屬性,這是因為依賴項屬性具有內置的更改通知支持,元素綁定表達式使用了Xaml擴展標記, WPF綁定一個控件是使用Binding.ElementName, 綁定非控件對象時使用Source,RelativeSource,DataContex…

【設計模式 04】代理模式

代理模式 代理模式( Proxy):為其他對象提供一種代理以控制對這個對象的訪問。 參考:refactoringguru | proxy 什么是代理模式 有時候如果想要訪問某個對象,但又沒辦法直接訪問或不方便直接訪問,可以使用代理模式,代理…

css 大于號 標簽_CSS設計基礎選擇器篇

點擊上方 Java項目學習 ,選擇 星標 公眾號重磅資訊、干貨,第一時間送達前言:如果將CSS樣式應用于特定的網頁對象上,需要先找到目標元素。在CSS樣式中執行這一任務的部分被稱為選擇器。1 標簽選擇器優點:為頁面中同類型…

CSDN博客投票活動開始了

自己堅持寫博客,一方面是為了將自己對知識點的理解做一個總結,另一方面也是因為自己看到了很多無私奉獻分享自己知識的小伙伴們,因此自己也想像他們那樣盡自己微薄之力把自己對某一知識點的理解分享給大家,或許算不上什么特高級的…