簡單工廠模式屬于類的創建型模式,又叫做靜態工廠方法模式。通過專門定義一個類來負責創建其他類的實例,被創建的實例通常都具有共同的父類。
二、模式中包含的角色及其職責1.工廠(Creator)角色簡單工廠模式的核心,它負責實現創建所有實例的內部邏輯。工廠類可以被外界直接調用,創建所需的產品對象。2.抽象(PRoduct)角色簡單工廠模式所創建的所有對象的父類,它負責描述所有實例所共有的公共接口。3.具體產品(Concrete Product)角色簡單工廠模式所創建的具體實例對象
三、具體實例現在有兩個類,分別是Apple和Banana,都有一個Get方法:
Apple.java
package cc.dewdrop;public class Apple{public void get(){System.out.println("采集蘋果");}}Banana.java
package cc.dewdrop;public class Banana{public void get(){System.out.println("采集香蕉");}}在主方法中實例化并分別調用個體方法:
package cc.dewdrop;public class SimpleFactory {public static void main(String[] args) {Apple apple = new Apple();Banana banana = new Banana();apple.get();banana.get(); }}發現兩個類都有一個共同的get方法,那么我們就可以抽象出一個接口,然后Apple和Banana兩個類分別實現這個接口:
Fruit.java
package cc.dewdrop;public interface Fruit {public void get();}Apple.java
package cc.dewdrop;public class Apple implements Fruit{public void get(){System.out.println("采集蘋果");}}Banana.java
package cc.dewdrop;public class Banana implements Fruit{public void get(){System.out.println("采集香蕉");}}在主方法中就可以使用下面這種方式來創建對象:
public class SimpleFactory {public static void main(String[] args) { Fruit apple = new Apple(); Fruit banana = new Banana(); apple.get(); banana.get(); }}根據簡單工廠模式的特點,現在就需要創建一個類來創建類的對象:
FruitFactory.java
package cc.dewdrop;public class FruitFactory { /** * 獲得Apple實例 */ public Fruit getApple() { return new Apple(); } /** * 獲得Banana實例 */ public Fruit getBanana() { return new Banana(); }}在主方法中就可以使用如下方式進行調用:
public class SimpleFactory {public static void main(String[] args) {Fruit apple = new FruitFactory().getApple();Fruit banana = new FruitFactory().getBanana();apple.get();banana.get(); }}再進一步,我們可以修改工廠類,使用靜態方法來創建對象:
FruitFactory.java
package cc.dewdrop;public class FruitFactory { /** * 獲得Apple實例 */ public static Fruit getApple() { return new Apple(); } /** * 獲得Banana實例 */ public static Fruit getBanana() { return new Banana(); }}在主方法中就可以直接使用類名來調用:
public class SimpleFactory {public static void main(String[] args) {Fruit apple = FruitFactory.getApple();Fruit banana = FruitFactory.getBanana();apple.get();banana.get(); }}進一步改進工廠類,希望有一個公用的方法來創建所有產品的對象:
FruitFactory.java
package cc.dewdrop;public class FruitFactory {public static Fruit getFruit(String type) throws InstantiationException, IllegalaccessException {if (type.equalsIgnoreCase("apple")) {return Apple.class.newInstance();} else if (type.equalsIgnoreCase("banana")) {return Banana.class.newInstance();} else {System.out.println("class not found");}return null;}}在主方法中使用如下方式調用:
public class SimpleFactory {public static void main(String[] args) {Fruit apple = FruitFactory.getFruit("apple");Fruit banana = FruitFactory.getFruit("banana");apple.get();banana.get(); }}這樣調用工廠類創建對象的操作就簡化了很多,但是還有一個缺點,就是如果在新增加一個類是,就必須修改工廠類。那么此時工廠類可以做出如下修改:
FruitFactory.java
package cc.dewdrop;public class FruitFactory {public static Fruit getFruit(String type)throws InstantiationException, IllegalAccessException, ClassNotFoundException {return (Fruit) Class.forName(type).newInstance();}}需要注意一點的是,在調用的時候需要使用類的完整路徑(包括包名):
public class SimpleFactory {public static void main(String[] args) {Fruit apple = FruitFactory.getFruit("cc.dewdrop.Apple");Fruit banana = FruitFactory.getFruit("cc.dewdrop.Banana");apple.get();banana.get(); }}四、簡單工廠模式的優缺點在這個模式中,工廠類是整個模式的關鍵所在。它包含必要的判斷邏輯,能夠根據外界給定的信息,決定究竟應該創建哪個具體類的對象。用戶在使用時可以直接根據工廠類去創建所需的實例,而無需了解這些對象是如何創建以及如何組織的。有利于整個軟件體系結構的優化 不難發現,簡單工廠模式的缺點也正體現在其工廠類上,由于工廠類集中了所有實例的創建邏輯,所以“高內聚”方面做的并不好。另外,當系統中的具體產品類不斷增多時,可能會出現要求工廠類也要做相應的修改,擴展性并不很好。
新聞熱點
疑難解答