設計模式總結篇系列:工廠方法模式(Factory Method)

工廠方法模式適合于對實現了同一接口或繼承了同一父類的一些類進行實例的創建。一般是通過定義一個工廠類,并在其方法中實現對具有上述特點的類對象的創建。

根據具體產生類對象的方法定義形式,又可以將其分為普通工廠方法模式、多個工廠方法模式和靜態工廠方法模式。

一、普通工廠方法模式:

常見的經典寫法如下(以發送郵件和短信為例):

1.定義郵件類和短信類具有的共同接口:

1 interface Sender{
2     
3     public void sender();
4     
5 }

2.定義郵件類和短信類:

復制代碼
1 class MailSender implements Sender{
2 
3     @Override
4     public void send() {
5         System.out.println("發送郵件");
6     }
7     
8 }
復制代碼
復制代碼
1 class SmsSender implements Sender{
2 
3     @Override
4     public void send() {
5         System.out.println("發送短信");
6     }
7     
8 }
復制代碼

3.定義工廠類:

復制代碼
 1 class SenderFactory {
 2 
 3     public Sender produce(String type) {
 4         if (type.equals("mail")) {
 5             return new MailSender();
 6         } else if (type.equals("sms")) {
 7             return new SmsSender();
 8         } else {
 9             return null;
10         }
11     }
12 
13 }
復制代碼

4.測試生成MailSender和SmsSender對象:

復制代碼
 1 package com.qqyumidi;
 2 
 3 public class FactoryMethodTest {
 4 
 5     public static void main(String[] args) {
 6         SenderFactory factory = new SenderFactory();
 7         Sender mailSender = factory.produce("mail");
 8         Sender smsSender = factory.produce("sms");
 9     }
10 
11 }
復制代碼

?

二、多個工廠方法模式:

將普通工廠模式中的工廠類中創建類的方法從依賴于參數判斷改為直接針對每種對象各自定義一個生產方法。

具體代碼如下:

復制代碼
 1 class SenderFactory {
 2 
 3     public Sender produceMail(){
 4         return new MailSender();
 5     }
 6     
 7     public Sender produceSms(){
 8         return new SmsSender();
 9     }
10 
11 }
復制代碼

?

三、靜態工廠方法模式:

靜態工廠方法模式與前面兩種具體的方法定義不同在于方法被定義成靜態的,這樣可以不通過創建工廠實例就能直接獲取到目標類的對象。

復制代碼
 1 class SenderFactory {
 2 
 3     public static Sender produceMail(){
 4         return new MailSender();
 5     }
 6     
 7     public static Sender produceSms(){
 8         return new SmsSender();
 9     }
10 
11 }
復制代碼

?

對于工廠方法模式,推薦使用第三種寫法。

?

---------------------------------------------------------------------------------
筆者水平有限,若有錯漏,歡迎指正,如果轉載以及CV操作,請務必注明出處,謝謝!
分類: 設計模式

本文轉自Windstep博客園博客,原文鏈接:http://www.cnblogs.com/lwbqqyumidi/p/3744842.html,如需轉載請自行聯系原作者

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

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

相關文章

高新園區到大連計算機學校,大連高新區中心小學

大連市高新區中心小學簡介:大連市高新區中心小學始建于2009年9月,是大連高新技術產業園區籌建的第一所直屬公辦學校。學校現擁有2000多名學生,87名教職員工。學校確定了“辦詩韻教育,讓每個孩子都幸福的教育理念”,通過…

java基礎之匿名內部類

內部類:   概述: 類里邊還有一個類, 里邊那個類叫內部類, 外邊那個類叫外部類.   分類:  成員內部類: 定義在成員位置的內部類.  局部內部類: 定義在局部位置的內部類. 格式:   new 類名或者接口名(){     //重寫類或者接口中 所有的 抽象方法;   };本質:  就…

0限流電阻 stm32_上/下拉電阻

除了前一節討論的拉電阻基本使用方法外,上拉電阻也可以提升高電平的電壓閾值,以便于前后級信號相匹配,比如,TTL邏輯電平驅動CMOS邏輯電平時,我們通常會添加一個上拉電阻R1,如下圖所示:But Why&a…

天地與我并存/萬物與我為一 2

http://blog.sina.com.cn/s/blog_17e792e010102y4lu.html 庖丁解牛 先秦:莊周 吾生也有涯,而知也無涯 。以有涯隨無涯,殆已!已而為知者,殆而已矣!為善無近名,為惡無近刑。緣督以為經&#xff0c…

網段和子網的區別_電焊石籠網與普通石籠網區別

對于石籠網,每個人都會想到在河中,橋梁附近和大壩上充滿石頭的籠子結構。今天,我們談論的是石籠網的一種電焊石籠網,它也是一種常見的石籠網,也被稱為六邊形石籠網。其功能與石籠網相同,但用法與普通石籠網…

jquery $(document).ready() 與window.onload的區別

轉載博客:http://www.jb51.net/article/21628.htm Jquery中$(document).ready()的作用類似于傳統JavaScript中的window.onload方法,不過與window.onload方法還是有區別的。 1.執行時間 window.onload必須等到頁面內包括圖片的所有元素加載完畢后…

小學三年級上冊計算機計劃,小學三年級數學上冊教學計劃

小學三年級數學上冊教學計劃一、班級情況分析這一學期我繼續擔任三年級數學教學工作,本班現有學生9人,其中男生3人,女生6人。三年級學生已經有兩年的數學學習經歷,對一些基礎性的數學知識有了初步的認識。學生已經比較習慣于新教材…

centos7查看當前cpu運行模式_雜集:centos7中設置服務開機自啟的兩種方法,歡迎補充...

前言:在日常使用linux系統過程中,安裝服務后系統不會自動啟動服務的。就算手動啟動了服務,只是當前生效,一旦服務器重啟后,系統不會自動啟動這些服務。如果每次重啟服務器都要自己手動啟動這些服務,一臺還闊…

Sort HDU5884(二分+多叉哈夫曼樹)

HDU5884 Sort 題意:有n個序列要進行歸并,每次歸并的代價是兩個序列的長度的和,要求最終的代價不能超過規定的T,求在此前提下一次能同時進行歸并的序列的個數k。 思路:還是太單純,看完題目一直以為要用歸并排…

python來源是什么_python起源?為什么使用python?直至愛上python的五個理由

原標題:python起源?為什么使用python?直至愛上python的五個理由Python的創始人,吉多范羅蘇姆,是一名荷蘭計算機程序員,他作為 Python 程序設計語言的作者而為人們熟知。在 Python 社區,吉多范羅…

Linux系統(五)負載均衡LVS集群之DR模式

序言 DR模式是lvs集群中三種負載均衡模式的其中一種,那么上一篇中我寫啦關于NAT模式的搭建與原理,為什么還要有DR模式與IP隧道模式呢? 首先我們來看3張圖。LVS/NAT模式如下圖: LVS/IP隧道模式,如下圖: LVS/…

Redux API之applyMiddleware

applyMiddleware(...middlewares) 使用包含自定義功能的 middleware 來擴展 Redux 是一種推薦的方式。Middleware 可以讓你包裝 store 的dispatch 方法來達到你想要的目的。同時, middleware 還擁有“可組合”這一關鍵特性。多個 middleware 可以被組合到一起使用&a…

計算機2018創業方向,推薦2018年創業的方向

原標題:推薦2018年創業的方向1 新電商傳統的零售業收到互聯網電商的重沖擊,從而進行線上線下的結合是必然的趨勢,新零售,新電商,是幾千萬零售企業成功轉型的必然之路,學習一套全面的新電商轉型的方法&#…

包無法安裝_詳細教程 | 安裝Python編程環境以及使用OpenpyXl操作Excel

詳細教程 | 安裝Python編程環境以及使用OpenpyXl操作Excel注意:下列教程為 Windows7 64位;Windows 10有部分步驟有差異,請參考使用!01 下載Python程序安裝包首先前往Python官網 www.python.org,進入官網點擊 Downloads,然后點擊 W…

Activity、Fragment、Dialog基類簡單整理

版權聲明:本文為HaiyuKing原創文章,轉載請注明出處! 概述 這里簡單記錄下Activity、Fragment、Dialog基類中的常規寫法,后續根據項目需求進行相應的擴展。 BaseActivity.java package com.why.project.myapptemplet.activity;impo…

request重定向_golang不想http自動處理重定向的解決方案

前言有時候發送http請求不想讓庫自動幫忙處理重定向,庫里面默認的是會把所有重定向都完成一遍,結果就是最后一個沒有重定向的請求的結果。因此需要一種方案直接獲取首次訪問的結果,不走重定向。go的http庫里面是使用如下代碼檢查重定向的&…

C語言項目開發-項目架構和編程命名規范

一個項目的流程:1、公司市場人員與客戶交流,了解客戶、引導客戶使用公司最優資源并產出一份市場需求文檔 2、公司需求人員(BA)與客戶交流,了解客戶需求并產出一個軟件需求文檔 3、項目經理、開發小組成員、需求人員&am…

ajax登錄驗證的原理,ajax用戶登錄驗證-get和post提交方式,與工作原理—2018-8-15...

ajax用戶登錄驗證:實例html>Ajax實戰:表單驗證用戶登錄郵箱: 密碼: 提交let btn document.getElementsByTagName(button)[0];btn.onclick function () {//1.創建xhr對象let xhr new XMLHttpRequest();//2.監聽響應狀態xhr.onreadystatechange function(){// …

將Python腳本打包成可執行文件

Python是一個腳本語言,被解釋器解釋執行。它的發布方式: .py文件:對于開源項目或者源碼沒那么重要的,直接提供源碼,需要使用者自行安裝Python并且安裝依賴的各種庫。(Python官方的各種安裝包就是這樣做的&a…

float foo=42e1為什么錯_為什么重寫了equals()也要重寫hashCode()

小Hub領讀:雖然是很基礎的一篇文章,但是對于equals、hashcode兩個方法,相信很多人都與其中的規則不熟悉,來跟著小Hub花個8分鐘回顧一下!作者:不學無數的程序員https://my.oschina.net/u/4030990/blog/31341…