Java设计模式 -- 简单工厂模式(SimpleFactory)
一、什么是簡單工廠模式
????? 簡單工廠模式屬于類的創建型模式,又叫做靜態工廠方法模式。通過專門定義一個類來負責創建其他類的實例,被創建的實例通常都具有共同的父類。
二、模式中包含的角色及其職責
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();} }?四、簡單工廠模式的優缺點
????? 在這個模式中,工廠類是整個模式的關鍵所在。它包含必要的判斷邏輯,能夠根據外界給定的信息,決定究竟應該創建哪個具體類的對象。用戶在使用時可以直接根據工廠類去創建所需的實例,而無需了解這些對象是如何創建以及如何組織的。有利于整個軟件體系結構的優化
????? 不難發現,簡單工廠模式的缺點也正體現在其工廠類上,由于工廠類集中了所有實例的創建邏輯,所以“高內聚”方面做的并不好。另外,當系統中的具體產品類不斷增多時,可能會出現要求工廠類也要做相應的修改,擴展性并不很好。
?
轉載于:https://www.cnblogs.com/zhangtingkuo/p/4715283.html
總結
以上是生活随笔為你收集整理的Java设计模式 -- 简单工厂模式(SimpleFactory)的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: Gold Balanced Lineup
 - 下一篇: java注解简单实例