最简单java设计模式:工厂方法模式
前言
在前一篇文章講解了一下簡單工廠模式,在上篇文章中,我們也講到了簡單工廠模式的缺點,就是不滿足開閉原則,這對于軟件的設計來說,是不太好的,而下面講解的工廠方法模式,正是為了彌補簡單工廠模式的缺點,也可以說是簡單工廠模式的改進版。
一、什么是工廠方法模式
工廠方法模式同樣屬于類的創建型模式又被稱為多態工廠模式 。工廠方法模式的意義是定義一個創建產品對象的工廠接口,將實際創建工作推遲到子類當中。核心工廠類不再負責產品的創建,這樣核心類成為一個抽象工廠角色,僅負責具體工廠子類必須實現的接口,這樣進一步抽象化的好處是使得工廠方法模式可以使系
統在不修改具體工廠角色的情況下引進新的產品。
二、工廠方法模式的角色和職責
1.抽象工廠(Creator)角色工廠方法模式的核心,任何工廠類都必須實現這個接口。
2.具體工廠( Concrete Creator)角色具體工廠類是抽象工廠的一個實現,負責實例化產品對象。
3.抽象(Product)角色工廠方法模式所創建的所有對象的父類,它負責描述所有實例所共有的公共接口。
4.具體產品(Concrete Product)角色工廠方法模式所創建的具體實例對象
三、工廠方法模式的UML圖
-
sports:抽象角色
-
Basketball和Football:具體產品角色
-
sportsFactory:抽象工廠角色
-
BasketballFactory和FootballFactory:具體工廠角色
四、工廠方法模式代碼
這個例子和簡單工廠方法模式一樣,用運動作為抽象角色,足球和籃球作為具體的產品角色來講解,下面看具體代碼。
首先我們創建一個抽象類sports,同時有一個運動的方法
public interface Sports {/** 運動*/public void play(); }然后,定義了一個足球類和籃球類,同樣有運動方法
public class Basketball implements Sports{/** 運動*/public void play(){System.out.println("打籃球...");} } public class Football implements Sports{/** 運動*/public void play(){System.out.println("踢足球啦...");} }最后寫一個工廠類,用來創造足球運動和籃球運動。
下面我們來更改簡單工廠模式的代碼,逐步的改為工廠方法模式。
4.1、抽象工廠接口
public interface SportsFactory {/** get方法,獲得所有產品對象*/public Sports getSports();}這里和簡單工廠模式不同,我們先需要一個抽象工廠接口,然后將具體的工廠實現到具體的子類中,這樣就能夠符合開閉原則
4.2、籃球具體工廠
public class BasketballFactory implements SportsFactory{@Overridepublic Sports getSports() {return new Basketball();}}4.3、足球具體工廠
public class FootballFactory implements SportsFactory {@Overridepublic Sports getSports() {return new Football();}}這樣就將具體的不同產品的實現,放到了具體的工廠來實現,當我們再增加其他的具體的產品時,只需要再增加一個具體的產品的工廠類,而不需要去改變原有的代碼,所以符合對擴展開放的思想。
五、測試
public class MainClass {public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {//創建籃球工廠SportsFactory basketballFactory = new BasketballFactory();Sports basketball = basketballFactory.getSports();basketball.play();//創建足球工廠SportsFactory footballFactory = new FootballFactory();Sports football = footballFactory.getSports();football.play();} }運行結果:
六、工廠方法模式的優缺點
工廠方法模式的優點
在工廠方法模式中,工廠方法用來創建客戶所需要的產品,同時還向客戶隱藏了哪種具體產品類將被實例化這一細節,用戶只需要關心所需產品對應的工廠,無須關心創建細節,甚至無須知道具體產品類的類名。
基于工廠角色和產品角色的多態性設計是工廠方法模式的關鍵。它能夠使工廠可以自主確定創建何種產品對象,而如何創建這個對象的細節則完全封裝在具體工廠內部。工廠方法模式之所以又被稱為多態工廠模式,是因為所有的具體工廠類都具有同一抽象父類。
使用工廠方法模式的另一個優點是在系統中加入新產品時,無須修改抽象工廠和抽象產品提供的接口,無須修改客戶端,也無須修改其他的具體工廠和具體產品,而只要添加一個具體工廠和具體產品就可以了。這樣,系統的可擴展性也就變得非常好,完全符合“開閉原則”。
工廠方法模式的缺點
在添加新產品時,需要編寫新的具體產品類,而且還要提供與之對應的具體工廠類,系統中類的個數將成對增加,在一定程度上增加了系統的復雜度,有更多的類需要編譯和運行,會給系統帶來一些額外的開銷。
由于考慮到系統的可擴展性,需要引入抽象層,在客戶端代碼中均使用抽象層進行定義,增加了系統的抽象性和理解難度,且在實現時可能需要用到DOM、反射等技術,增加了系統的實現難度。
七、適用場景
一個類不知道它所需要的對象的類:在工廠方法模式中,客戶端不需要知道具體產品類的類名,只需要知道所對應的工廠即可,具體的產品對象由具體工廠類創建;客戶端需要知道創建具體產品的工廠類。
一個類通過其子類來指定創建哪個對象:在工廠方法模式中,對于抽象工廠類只需要提供一個創建產品的接口,而由其子類來確定具體要創建的對象,利用面向對象的多態性和里氏代換原則,在程序運行時,子類對象將覆蓋父類對象,從而使得系統更容易擴展。
將創建對象的任務委托給多個工廠子類中的某一個,客戶端在使用時可以無須關心是哪一個工廠子類創建產品子類,需要時再動態指定,可將具體工廠類的類名存儲在配置文件或數據庫中。
八、工廠方法模式和簡單工廠模式比較
工廠方法模式與簡單工廠模式在結構上的不同不是很明顯。工廠方法類的核心是一個抽象工廠類,而簡單工廠模式把核心放在一個具體類上。
工廠方法模式之所以有一個別名叫多態性工廠模式是因為具體工廠類都有共同的接口,或者有共同的抽象父類。當系統擴展需要添加新的產品對象時,僅僅需要添加一個具體對象以及一個具體工廠對象,原有工廠對象不需要進行任何修改,也
不需要修改客戶端,很好的符合了“開放-封閉”原則。
而簡單工廠模式在添加新產品對象后不得不修改工廠方法,擴展性不好。
工廠方法模式退化后可以演變成簡單工廠模式。
總結
以上是生活随笔為你收集整理的最简单java设计模式:工厂方法模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java设计模式:简单工厂模式
- 下一篇: http简介看这篇就够了