簡單工廠模式屬於類的建立型模式,又叫作靜態工廠方法模式。經過專門定義一個類來負責建立其餘類的實例,被建立的實例一般都具備共同的父類。java
1.工廠(Creator)角色簡單工廠模式的核心,它負責實現建立全部實例的內部邏輯。工廠類能夠被外界直接調用,建立所需的產品對象。
2.抽象(Product)角色簡單工廠模式所建立的全部對象的父類,它負責描述全部實例所共有的公共接口。
3.具體產品(Concrete Product)角色簡單工廠模式所建立的具體實例對象app
如今有兩個類,分別是Apple和Banana,都有一個Get方法:優化
Apple.javaui
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("採集香蕉"); } }
在主方法中實例化並分別調用個體方法:blog
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.javaget
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.javait
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(); } }
在這個模式中,工廠類是整個模式的關鍵所在。它包含必要的判斷邏輯,可以根據外界給定的信息,決定究竟應該建立哪一個具體類的對象。用戶在使用時能夠直接根據工廠類去建立所需的實例,而無需瞭解這些對象是如何建立以及如何組織的。有利於整個軟件體系結構的優化 不難發現,簡單工廠模式的缺點也正體如今其工廠類上,因爲工廠類集中了全部實例的建立邏輯,因此「高內聚」方面作的並很差。另外,當系統中的具體產品類不斷增多時,可能會出現要求工廠類也要作相應的修改,擴展性並不很好。