標籤:
一、什麼是簡單原廠模式
簡單原廠模式屬於類的建立型模式,又叫做靜態Factory 方法模式。通過專門定義一個類來負責建立其他類的執行個體,被建立的執行個體通常都具有共同的父類。
二、模式中包含的角色及其職責
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(); }} 四、簡單原廠模式的優缺點
在這個模式中,工廠類是整個模式的關鍵所在。它包含必要的判斷邏輯,能夠根據外界給定的資訊,決定究竟應該建立哪個具體類的對象。使用者在使用時可以直接根據工廠類去建立所需的執行個體,而無需瞭解這些對象是如何建立以及如何組織的。有利於整個軟體體繫結構的最佳化
不難發現,簡單原廠模式的缺點也正體現在其工廠類上,由於工廠類集中了所有執行個體的建立邏輯,所以“高內聚”方面做的並不好。另外,當系統中的具體產品類不斷增多時,可能會出現要求工廠類也要做相應的修改,擴充性並不很好。
Java設計模式 -- 簡單原廠模式(SimpleFactory)