1. 程式人生 > >設計模式——工廠方法模式及在jdk中的應用

設計模式——工廠方法模式及在jdk中的應用

工廠方法模式(Factory Method)

定義:定義一個用於建立物件的介面,讓子類決定例項化哪一個類,工廠方法使一個類的例項化延遲到其子類。

型別:建立類模式


工廠方法模式分為三種:

11、普通工廠模式,就是建立一個工廠類,對實現了同一介面的一些類進行例項的建立。首先看下關係圖:

舉例如下:(我們舉一個傳送郵件和簡訊的例子)

首先,建立二者的共同介面:

  1. publicinterface Sender {  
  2.     publicvoid Send();  
  3. }  

其次,建立實現類:

  1. publicclass MailSender implements Sender {  
  2.     @Override
  3.     publicvoid Send() {  
  4.         System.out.println("this is mailsender!");  
  5.     }  
  6. }  
  1. publicclass SmsSender implements Sender {  
  2.     @Override
  3.     publicvoid Send() {  
  4.         System.out.println("this is sms sender!");  
  5.     }  
  6. }  

最後,建工廠類:

  1. publicclass SendFactory {  
  2.     public
     Sender produce(String type) {  
  3.         if ("mail".equals(type)) {  
  4.             returnnew MailSender();  
  5.         } elseif ("sms".equals(type)) {  
  6.             returnnew SmsSender();  
  7.         } else {  
  8.             System.out.println("請輸入正確的型別!");  
  9.             returnnull;  
  10.         }  
  11.     }  
  12. }  

22、多個工廠方法模式,是對普通工廠方法模式的改進,在普通工廠方法模式中,如果傳遞的字串出錯,則不能正確建立物件,而多個工廠方法模式是提供多個工廠方法,分別建立物件。關係圖:

將上面的程式碼做下修改,改動下SendFactory類就行,如下:

  1. publicclass SendFactory {  
  2.     public Sender produceMail(){  
  3.         returnnew MailSender();  
  4.     }  
  5.     public Sender produceSms(){  
  6.         returnnew SmsSender();  
  7.     }  
  8. }  

測試類如下:

  1. publicclass FactoryTest {  
  2.     publicstaticvoid main(String[] args) {  
  3.         SendFactory factory = new SendFactory();  
  4.         Sender sender = factory.produceMail();  
  5.         sender.Send();  
  6.     }  
  7. }  

輸出:this is mailsender!

33、靜態工廠方法模式,將上面的多個工廠方法模式裡的方法置為靜態的,不需要建立例項,直接呼叫即可。

  1. publicclass SendFactory {  
  2.     publicstatic Sender produceMail(){  
  3.         returnnew MailSender();  
  4.     }  
  5.     publicstatic Sender produceSms(){  
  6.         returnnew SmsSender();  
  7.     }  
  8. }  
  1. publicclass FactoryTest {  
  2.     publicstaticvoid main(String[] args) {      
  3.         Sender sender = SendFactory.produceMail();  
  4.         sender.Send();  
  5.     }  
  6. }  

輸出:this is mailsender!

總體來說,工廠模式適合:凡是出現了大量的產品需要建立,並且具有共同的介面時,可以通過工廠方法模式進行建立。在以上的三種模式中,第一種如果傳入的字串有誤,不能正確建立物件,第三種相對於第二種,不需要例項化工廠類,所以,大多數情況下,我們會選用第三種——靜態工廠方法模式。

適用場景:

        不管是簡單工廠模式,工廠方法模式還是抽象工廠模式,他們具有類似的特性,所以他們的適用場景也是類似的。

        首先,作為一種建立類模式,在任何需要生成複雜物件的地方,都可以使用工廠方法模式。有一點需要注意的地方就是複雜物件適合使用工廠模式,而簡單物件,特別是只需要通過new就可以完成建立的物件,無需使用工廠模式。如果使用工廠模式,就需要引入一個工廠類,會增加系統的複雜度。

       其次,工廠模式是一種典型的解耦模式,迪米特法則在工廠模式中表現的尤為明顯。假如呼叫者自己組裝產品需要增加依賴關係時,可以考慮使用工廠模式。將會大大降低物件之間的耦合度。

       再次,由於工廠模式是依靠抽象架構的,它把例項化產品的任務交由實現類完成,擴充套件性比較好。也就是說,當需要系統有比較好的擴充套件性時,可以考慮工廠模式,不同的產品用不同的實現工廠來組裝。

具體體現:

  • Spring框架中的Bean工廠,這是一個複雜物件,所以適合用工廠模式
  • JDK中體現:Collection.iterator方法
    類圖:



相關推薦

設計模式——工廠方法模式jdk應用

工廠方法模式(Factory Method) 定義:定義一個用於建立物件的介面,讓子類決定例項化哪一個類,工廠方法使一個類的例項化延遲到其子類。 型別:建立類模式 工廠方法模式分為三種: 11、普通工廠模式,就是建立一個工廠類,對實現了同一介面的一些類進行

Spring設計模式--工廠方法模式

關於工廠方法模式的誤會 不太在意設計模式的同事會對工廠模式有極深的誤解,總會把“工廠模式”與“靜態工廠方法”混為一談,什麼是靜態工廠方法?看一個簡單的例子: public class SimpleClientFactory { public

Note8:C#設計模式工廠方法模式(VS 簡單工廠模式 & 抽象工廠模式

工廠方法模式 blog 抽象工廠 nbsp strong str cnblogs note 設計 一、資源說明 (1)本文有參考:http://www.cnblogs.com/zhili/p/FactoryMethod.html 待更!Note8:C#設計模式—工廠方法

PHP面向對象-設計模式 單例模式 簡單工廠模式 工廠方法模式

單例 nbsp 私有化 {} 意義 pan php代碼 get fun 1.單例模式   單例模式是一種常用的軟件設計模式。在它的核心結構中只包含一個被稱為單例的特殊類。通過單例模式可以保證系統中一個類只有一個實例。即一個類只有一個對象實例。   要實現每一個類只有一個實例

C#設計模式——工廠方法模式

osc tor cas 模式 main csharp plan ofa mar 一、引言   在簡單工廠中講到簡單工廠模式的缺點,有一點是——簡單工廠模式系統難以擴展,一旦添加新產品就不得不修改簡單工廠方法,這樣就會造成簡單工廠的實現邏輯過於復雜,然而本專題介紹的工廠方法模

Java設計模式--工廠方法模式

必須 產品 str 應用程序 實現 工廠方法模式 調用 方法 png 角色 抽象工廠:擔任這個角色是工廠方法模式的核心,它是與應用程序無關的。任何在模式中創建對象的工廠類都必須實現這個接口。 具體工廠:擔任這個角色的是實現了抽象工廠接口的具體Java類。具體工廠角色含有與應

Java設計模式-工廠方法模式(Factory Method)

print blog -i pri cnp 三種模式 image void share 工廠方法模式(Factory Method) 工廠模式適合:凡是出現了大量的產品需要創建,並且具有共同的接口時,可以通過工廠方法模式進行創建。在以下的三種模式中,第一種如果傳入的字符串

設計模式-工廠方法模式

集合類 tof col 進行 bool down urn DC 角色 在簡單工廠模式中,我們發現存在很多問題: 由於工廠類集中了所有產品創建邏輯,一旦不能正常工作,整個系統都要受到影響。 要新增產品類的時候,就要修改工廠類的代碼,違反了開放封閉原則(對擴展的開放,對修改的

設計模式】簡單工廠模式 |工廠方法模式 |抽象工廠模式

簡單工廠模式 由三種角色組成: 1、工廠類角色:是簡單工廠模式的核心,含有一定的商業邏輯和判斷邏輯。 2、抽象產品角色:一般是具體產品繼承的父類或者實現的介面。 3、具體產品角色:工廠類所建立的物件就是此角色的例項。 用一個單獨的類來做這個創在例項的過程,這就

android設計模式——工廠方法模式

定義:定義一個用於建立物件的介面,讓子類決定例項化哪個類. 使用場景: 在任何需要生成複雜物件的地方,都可以使用工廠方法模式. 應用舉例:去工廠提貨物,只需說要什麼貨,不必知道貨物是怎麼做出來的 類圖: Factory,抽象的工廠類 ConcreteFactory,具

Java設計模式(一)之建立型模式工廠模式(簡單工廠模式+工廠方法模式

在面向物件程式設計中, 最通常的方法是一個new操作符產生一個物件例項,new操作符就是用來構造物件例項的。但是在一些情況下, new操作符直接生成物件會帶來一些問題。舉例來說,許多型別物件的建立需要一系列的步驟:你可能需要計算或取得物件的初始位置;選擇生成哪個子物件例項;或在你生成你需要的物件

java常用設計模式--工廠方法模式簡單例子

package com.ruanyun;/** * @Auther: maxw * @Date: 2018/11/12 11:02 * @Description:工廠方法模式:有四個角色,抽象工廠模式,具體工廠模式,抽象產品模式,具體產品模式。不再是由一個工廠類去例項化具體的產品,而是由抽象工廠的子類去例項化

Java設計模式工廠方法模式&抽象工廠模式

工廠方法模式與抽象工廠模式都是設計模式中重要而且常見的模式。       工廠方法模式:定義一個用於建立物件的介面,讓子類決定例項化哪一個類。工廠方法使一個類的例項化延遲到其子類。 通用類圖如下:        

用心理解設計模式——工廠方法模式 (Factory Method Pattern)

前置文章: 用心理解設計模式——設計模式的原則  設計模式相關程式碼已統一放至 我的 Github   一、定義   建立型模式之一。   Define an interface for creating an object, b

設計模式 --- 工廠方法模式

1.定義 一定一個建立物件的介面,讓子類決定例項化哪個類。   2.使用場景 在任何需要生成複雜物件的地方,都可以使用工廠方法模式。   3.簡單實現 以一個汽車組裝為例,汽車廠主要以組裝一款SUV車型,比如Q3、Q5、Q7,對於這類車型內部差異並不大

C++設計模式——工廠方法模式

問題描述 之前講到了C++設計模式——簡單工廠模式,由於簡單工廠模式的侷限性,比如:工廠現在能生產ProductA、ProductB和ProductC三種產品了,此時,需要增加生產ProductD產品;那麼,首先是不是需要在產品列舉型別中新增新的產品型別標識,然後,修改Fa

23種設計模式----工廠方法模式----建立型模式

工廠方法模式或者說是簡單工廠方法。 ps:學會模板方法再學習工廠方法更簡單,或者說工廠方法模式是在模板方法的基礎上進行設計的。 1.什麼是工廠方法模式 將例項的生成交給子類(出自《圖解設計模式》) 這句話怎麼理解? 我自己的理解就是把建立和實現分離。 使用工廠

設計模式---工廠方法模式

模式描述:        提供一個用於建立物件的介面(工廠介面),讓其實現類(工廠實現類)決定例項化哪一個類(產品類),並且由該實現類建立對應類的例項。 模式作用:        可以一定程度上解耦,消費者和產品實現類隔離開,只依賴產品介面(抽象產品),產品實現

C#設計模式-工廠方法模式

using System; namespace TestCS { class Program { static void Main(string[] args) { CarFactory factory0 = new CarF

C++設計模式——工廠方法模式和抽象工廠方法模式

一、工廠方法模式 上面的簡單工廠模式的缺點是當新增產品的時候就要去修改工廠的類,這就違反了開放封閉原則,(類、模組、函式)可以擴充套件,但是不可以修改,於是,就出現了工廠方法模式。所謂工廠方法模式,是指定義一個用於建立物件的介面,讓子類決定例項化哪一個類。 #d