Java設計模式 -- 簡單原廠模式(SimpleFactory)

來源:互聯網
上載者:User

標籤:

一、什麼是簡單原廠模式

      簡單原廠模式屬於類的建立型模式,又叫做靜態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)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.