一、關於工廠模式
工廠模式是我們最常用的實例化對象模式了,是用工廠方法代替new操作的一種模式。著名的Jive論壇 ,就大量使用了工廠模式,工廠模式在Java程序系統可以說是隨處可見。因爲工廠模式就相當於創建實例對象的new,我們經常要根據類Class生成實例對象,如A a=new A() 工廠模式也是用來創建實例對象的,所以以後new時就要多個心眼,是否可以考慮使用工廠模式,雖然這樣做,可能多做一些工作,但會給你係統帶來更大的可擴展性和儘量少的修改量。
總結:工廠模式用來創建實例對象。
工廠模式在一些需要生成複雜對象的情景下建議使用,但是簡單的需求,特別是只需要new就創建對象的時候,其實是不建議去使用工廠模式的,我們在使用工廠模式的時候,必須要引入一個Factory類,這增加了系統的複雜度,所以工廠模式的選擇,需要設計者自己去判斷。
優點:1。程序獲取對象的時候,不用再關心對象實現的過程,通過對象名可以直接獲取到對象實例;2.提高了程序的擴展性,需要新增一個類的時候,直接擴展工廠類即可。
缺點:增加了系統的複雜度。
使用場景
1、日誌記錄器:記錄可能記錄到本地硬盤、系統事件、遠程服務器等,用戶可以選擇記錄日誌到什麼地方。
2、數據庫訪問,當用戶不知道最後系統採用哪一類數據庫,以及數據庫可能有變化時。
3、設計一個連接服務器的框架,需要三個協議,"POP3"、"IMAP"、"HTTP",可以把這三個作爲產品類,共同實現一個接口。
二、實現
五種不同的計費方式背景下的工廠模式實現
1.創建FeeInterface.java接口(抽象產品)
/**
* \* User: Baldwin
* \* E_Mail: [email protected] || [email protected]
* \* Date: 2020/3/16
* \* Time: 12:16
* \* Description:
* \
*/
public interface FeeInterface {
String getToken();
String reqFee();
}
接口中定義兩個方法
2.分別創建三種計費封裝類,並繼承FeeInterface接口(具體產品)
import cn.yzstu.factory.fee.FeeInterface;
/**
* \* User: Baldwin
* \* E_Mail: [email protected] || [email protected]
* \* Date: 2020/3/16
* \* Time: 12:18
* \* Description:
* \
*/
public class GzFee implements FeeInterface {
public String getToken() {
return "GzToken";
}
public String reqFee() {
return "GzFee";
}
}
import cn.yzstu.factory.fee.FeeInterface;
/**
* \* User: Baldwin
* \* E_Mail: [email protected] || [email protected]
* \* Date: 2020/3/16
* \* Time: 12:19
* \* Description:
* \
*/
public class MelonFee implements FeeInterface {
public String getToken() {
return "MelonToken";
}
public String reqFee() {
return "MelonFee";
}
}
import cn.yzstu.factory.fee.FeeInterface;
/**
* \* User: Baldwin
* \* E_Mail: [email protected] || [email protected]
* \* Date: 2020/3/16
* \* Time: 12:20
* \* Description:
* \
*/
public class BeiJingFee implements FeeInterface {
public String getToken() {
return "BeiJingoken";
}
public String reqFee() {
return "BeiJingFee";
}
}
3.創建FeeFactory工廠類(具體工廠)
import cn.yzstu.factory.fee.FeeInterface;
import cn.yzstu.factory.fee.impl.BeiJingFee;
import cn.yzstu.factory.fee.impl.GzFee;
import cn.yzstu.factory.fee.impl.MelonFee;
/**
* \* User: Baldwin
* \* E_Mail: [email protected] || [email protected]
* \* Date: 2020/3/16
* \* Time: 12:02
* \* Description:
* \
*/
public class FeeFactory {
public FeeInterface getFee(String feeName){
if (feeName == null) return null;
FeeInterface feeInterface;
if ("gzfee".equals(feeName)) {
feeInterface = new GzFee();
} else if ("MelonFee".equals(feeName)) {
feeInterface = new MelonFee();
} else if ("BeiJing".equals(feeName)) {
feeInterface = new BeiJingFee();
}else {
feeInterface = null;
}
return feeInterface;
}
}
4.應用類(產品使用者)
import cn.yzstu.factory.fee.FeeInterface;
/**
* \* User: Baldwin
* \* E_Mail: [email protected] || [email protected]
* \* Date: 2020/3/16
* \* Time: 12:31
* \* Description:
* \
*/
public class Demo {
public static void main(String[] args) {
FeeInterface fee = FeeFactory.getFee("BeiJing");
System.out.println(fee.reqFee());
}
}
5.運行結果