工廠方法模式定義
Define an interface for creating an object,but let subclasses decide which class to instantite.Factory Method lets a class defer instantation to subclass.
工廠方法模式的一般類圖
工廠方法模式的通用源碼
1.抽象產品類
1
2
3
4
5
6
7
8
|
package FactoryMethod; public abstract class Product { public void method1(){ System.out.println( "這是產品類的業務邏輯處理方法" ); } public abstract void method2(); |
2.具體的產品類
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
package FactoryMethod; public class ConcreteProduct1 extends Product { @Override public void method2() { System.out.println( "這是產品一的業務邏輯處理方法" ); } } package FactoryMethod; public class ConcreteProduct2 extends Product { @Override public void method2() { System.out.println( "這是產品二的業務邏輯處理方法" ); } } |
3.抽象工廠類
1
2
3
4
5
|
package FactoryMethod; public abstract class Creator { public abstract extends Product> T createProduct(Class c); } |
4.具體工廠類
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
package FactoryMethod; public class ConcreteCreator extends Creator { public extends Product> T createProduct(Class c) { Product product = null ; try { product = (Product)Class.forName(c.getName()).newInstance(); } catch (Exception e) { e.printStackTrace(); } return (T)product; } } |
5.客戶端代碼
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
package FactoryMethod; public class Client { /** * @author ZhangH */ public static void main(String[] args) { Creator creator = new ConcreteCreator(); Product product1 = creator.createProduct(ConcreteProduct1. class ); Product product2 = creator.createProduct(ConcreteProduct2. class ); product1.method1(); product1.method2(); System.out.println(); product2.method1(); product2.method2(); } } |
工廠方法模式的優點
優點:
1. 良好的封裝性,降低模塊間的耦合;
2. 面向產品接口,屏蔽產品類。
3. 典型的解耦框架。高層模塊只需要知道產品的抽象類。
4. 符合迪米特法則、依賴倒置原則、里氏替換原則。
工廠方法模式的特殊應用
-
簡單工廠模式(靜態工廠模式)
-
描述:去掉了工廠方法模式中的工廠抽象類,同時把具體工廠方法中的方法設置爲靜態。
-
優點:簡化結構、調用過程
-
缺點:不利於擴展、不符合開閉原則
-
-
多個工廠方法模式
-
描述:對普通工廠方法模式的改進,多個工廠方法模式是提供多個工廠方法,分別創建對象
-
優點:創建類的職責清晰,結構簡單
-
缺點:增加擴展難度(增加協調類,封裝子工廠類,對高層提供統一的訪問接口)
-
-
替代單例模式
-
描述:採用工廠方法模式實現單例模式的功能
-
做法:
-
私有單例類,不允許new出對象
-
在工廠類內,使用反射機制創建一個對象
-
-
-
延遲初始化
-
描述一個對象被消費完畢後,不立刻釋放,工廠類保持其,等待再次使用。
-
做法:
-
在工廠類中以集合的形式容納所有產生對象
-
每次請求創建時,如果集合中已有則直接返回;若沒有則創建,放入集合並返回
-
-
參考資料:
《設計模式之禪》 秦小波著