java设计模式:简单工厂模式
一、什么是簡單工廠模式
簡單工廠模式屬于類的創建型模式,又叫做靜態工廠方法模式。通過專門定義一個類來負責創建其他類的實例,被創建的實例通常都具有共同的父類。
二、簡單工廠模式的角色和職責
1.工廠(Creator)角色簡單工廠模式的核心,它負責實現創建所有實例的內部邏輯。工廠類可以被外界直接調用,創建所需的產品對象。
2.抽象(Product)角色簡單工廠模式所創建的所有對象的父類,它負責描述所有實例所共有的公共接口。
3.具體產品(Concrete Product)角色簡單工廠模式所創建的具體實例對象
三、簡單工廠模式的UML圖
sports:抽象角色
Basketball和Football:具體產品角色
sportsFactory:工廠角色
四、簡單工廠模式代碼
這個例子,用運動作為抽象角色,足球和籃球作為具體的產品角色來講解,下面看具體代碼。
首先我們創建一個抽象類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 class SportsFactory {/** 獲得Basketball類的實例public static Sports getBasketball() {return new Basketball();}/** 獲得Football類實例*/public static Sports getFootball() {return new Football();} }這種方法,直接用兩個不同的方法直接創建兩個實例對象。
4.2、邏輯判斷的方式
public class SportsFactory {/** getSports方法,獲得所有產品對象*/public static Sports getSports(String type) throws InstantiationException, IllegalAccessException, ClassNotFoundException {if(type.equalsIgnoreCase("Basketball")) {return Basketball.class.newInstance();} else if(type.equalsIgnoreCase("Football")) {return Football.class.newInstance();} else {System.out.println("找不到相應的實例化類");return null;}} }先傳入一個類型參數,然后判斷,再用反射的方式返回對象。
前面這兩種方式都不是最優的方式,因為他們都違背了開閉原則。
開閉原則定義:一個軟件實體如類、模塊和函數應該對擴展開放,對修改關閉。
開放-封閉原則的意思就是說,你設計的時候,時刻要考慮,盡量讓這個類是足夠好,寫好了就不要去修改了,如果新需求來,我們增加一些類就完事了,原來的代碼能不動則不動。這個原則有兩個特性,一個是說“對于擴展是開放的”,另一個是說“對于更改是封閉的”。面對需求,對程序的改動是通過增加新代碼進行的,而不是更改現有的代碼。這就是“開放-封閉原則”的精神所在。
下面,我們再優化一下。
4.3、反射實現方式
public class SportsFactory {/** getSports方法,獲得所有產品對象*/public static Sports getSports(String type) throws InstantiationException, IllegalAccessException, ClassNotFoundException {Class Sports = Class.forName(type);return (Sports) Sports.newInstance();} }這種方法,通過反射的方式實現,不管我們還需要擴展什么其他功能都不用再更改這個工廠類的代碼了,所以就符合開閉原則了。
五、測試
public class MainClass {public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {//方法一測試 // //實例化一個Basketball // Basketball Basketball = new Basketball(); // //實例化一個Football // Football Football = new Football(); // // Basketball.play(); // Football.play();//方法二測試 // //實例化一個Basketball,用到了多態 // Sports Basketball = new Basketball(); // Sports Football = new Football(); // Basketball.play(); // Football.play();// //實例化一個Basketball // Sports Basketball = SportsFactory.playBasketball(); // Sports Football = SportsFactory.playFootball(); // Basketball.play(); // Football.play();//方法三測試Sports Basketball = SportsFactory.getSports("Basketball");Sports Football = SportsFactory.getSports("Football");Basketball.play();Football.play();} }運行結果:
六、簡單工廠模式應用場景
**優點:**工廠類是整個模式的關鍵.包含了必要的邏輯判斷,根據外界給定的信息,決定究竟應該創建哪個具體類的對象.通過使用工廠類,外界可以從直接創建具體產品對象的尷尬局面擺脫出來,僅僅需要負責“消費”對象就可以了。而不必管這些對象究竟如何創建及如何組織的.明確了各自的職責和權利,有利于整個軟件體系結構的優化。
缺點:由于工廠類集中了所有實例的創建邏輯,違反了開閉原則,將全部創建邏輯集中到了一個工廠類中;它所能創建的類只能是事先考慮到的,如果需要添加新的類,則就需要改變工廠類了。當系統中的具體產品類不斷增多時候,可能會出現要求工廠類根據不同條件創建不同實例的需求.這種對條件的判斷和對具體產品類型的判斷交錯在一起,很難避免模塊功能的蔓延,對系統的維護和擴展非常不利;
總結
以上是生活随笔為你收集整理的java设计模式:简单工厂模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一文看透java8新特性
- 下一篇: 最简单java设计模式:工厂方法模式