歡迎關注微信公衆號:FSA全棧行動 👋java
工廠模式提供了一種建立對象的最佳方式,咱們在建立對象時不會對客戶端暴露建立邏輯,而且是經過使用一個共同的接口來指向新建立的對象。微信
提示:工廠模式適合複雜對象的建立markdown
簡單工廠能夠根據不一樣參數返回不一樣類的實例,須要專門定義一個工廠類來負責建立其餘類的實例,被建立實例一般都具備共同的父類或接口;簡單工廠又稱 靜態工廠方法,可經過類名直接調用 ,並且只須要傳入簡單的參數便可。ide
建立抽象產品類:oop
/** * 抽象產品 * * @author GitLqr */
public interface IPay {
/** * 下單功能 */
void order();
}
複製代碼
建立具體產品類:微信支付
/** * 具體產品:微信支付 * * @author GitLqr */
public class WechatPay implements IPay {
@Override
public void order() {
System.out.println("微信 下單");
}
}
/** * 具體產品:支付寶支付 * * @author GitLqr */
public class AliPay implements IPay {
@Override
public void order() {
System.out.println("支付寶 下單");
}
}
複製代碼
建立工廠類:spa
/** * 工廠類 * * @author GitLqr */
public class PayFactory {
/** * 根據參數 返回對應的支付對象 */
public static IPay createPay(String payType) {
switch (payType) {
case "alipay":
return new AliPay();
case "wechat":
return new WechatPay();
default:
return null;
}
}
}
複製代碼
使用:設計
public static void main(String[] args) {
// 簡單工廠
// IPay pay = PayFactory.createPay("alipay");
IPay pay = PayFactory.createPay("wechat");
pay.order();
}
複製代碼
工廠方法又稱 工廠模式,是對簡單工廠模式的進一步抽象化,其好處是可使系統在不修改原來代碼的狀況下引進新的產品,即知足開閉原則。經過工廠父類定義負責建立產品的公共接口,經過子類來肯定所須要建立的類型。code
建立抽象工廠類:orm
/** * 抽象工廠類 * * @author GitLqr */
public interface IPayFactory {
public IPay getPay();
}
複製代碼
建立具體工廠類:
/** * 具體工廠類:建立 支付寶支付 對象 * * @author GitLqr */
public class AliPayFactory implements IPayFactory {
@Override
public IPay getPay() {
return new AliPay();
}
}
/** * 具體工廠類:建立 微信支付 對象 * * @author GitLqr */
public class WechatPayFactory implements IPayFactory {
@Override
public IPay getPay() {
return new WechatPay();
}
}
複製代碼
使用:
public static void main(String[] args) {
// 工廠方法
// IPayFactory payFactory = new AliPayFactory();
IPayFactory payFactory = new WechatPayFactory();
payFactory.getPay().order();
}
複製代碼
補充:若是後續須要增長第三種支付方式,好比銀聯支付,那麼只須要再擴展出具體產品
UnionPay
,以及具體工廠UnionPayFactory
便可,而無需改動原有的類。
抽象工廠模式是基於上述兩種模式的拓展,是工廠方法模式的升級版,當須要建立的產品有多個產品線時使用抽象工廠模式是比較好的選擇。
補充:當抽象工廠模式中每個具體工廠類只建立一個產品對象時,抽象工廠模式退化成工廠方法模式。
假設 "產品" 如今不僅有 支付,還須要有 退款,提現 等,這時,"產品" 的【抽象產品類】和【具體產品類】將拓展爲以下所示:
支付(IPay) | 退款(IRefund) | 提現(ICashout) | |
---|---|---|---|
支付寶 | AliPay | AliRefund | AliCashout |
微信 | WechatPay | WechatRefund | WechatCashout |
銀聯 | UnionPay | UnionRefund | UnionCashout |
根據 工廠方法模式 的核心要求(一種工廠 對應生成 一種產品),那麼對應的【抽象工廠類】和【具體工廠類】將拓展爲以下所示:
支付(IPayFactory) | 退款(IRefundFactory) | 提現(ICashoutFactory) | |
---|---|---|---|
支付寶 | AliPayFactory | AliRefundFactory | AliCashoutFactory |
微信 | WechatPayFactory | WechatRefundFactory | WechatCashoutFactory |
銀聯 | UnionPayFactory | UnionRefundFactory | UnionCashoutFactory |
這時就會發現,嚴格按照工廠方法模式的要求會有以下弊端:
其實這些 "產品"(支付、退款、提現...)都是屬於一類(訂單相關), 所以,能夠對【抽象工廠類】進行加強,由一個【抽象工廠類】來負責生產一類 "產品",例如能夠建立 IOrderFactory,彙總 IPayFactory、IRefundFactory、ICashoutFactory 的建立方法並對它們進行取締。因而,使用了抽象工廠模式後,對應的【抽象工廠類】和【具體工廠類】將拓展爲以下所示:
支付、退款、提現(IOrderFactory) | |
---|---|
支付寶 | AliOrderFactory |
微信 | WechatOrderFactory |
銀聯 | UnionOrderFactory |
注意:抽象工廠 相比 工廠方法,就是加強了抽象工廠類,同時思想上也有了重大變化,讓抽象工廠類再也不侷限於一種產品,而是一系列產品。
建立抽象產品類:
/** * 抽象產品 * * @author GitLqr */
public interface IRefund {
/** * 退款 */
void refund();
}
複製代碼
建立具體產品類:
/** * 具體產品:支付寶退款 * * @author GitLqr */
public class AliRefund implements IRefund {
@Override
public void refund() {
System.out.println("支付寶 退款");
}
}
/** * 具體產品:微信退款 * * @author GitLqr */
public class WechatRefund implements IRefund {
@Override
public void refund() {
System.out.println("微信 退款");
}
}
複製代碼
建立抽象工廠類【加強版】:
/** * 抽象工廠類【加強版】 * * @author GitLqr */
public interface IOrderFactory {
IPay getPay();
IRefund getRefund();
}
複製代碼
建立具體工廠類【加強版】:
/** * 具體工廠類:建立 支付寶 訂單相關的一系列產品功能 * * @author GitLqr */
public class AliOrderFactory implements IOrderFactory {
@Override
public IPay getPay() {
return new AliPay();
}
@Override
public IRefund getRefund() {
return new AliRefund();
}
}
/** * 具體工廠類:建立 微信 訂單相關的一系列產品功能 * * @author GitLqr */
public class WechatOrderFactory implements IOrderFactory {
@Override
public IPay getPay() {
return new WechatPay();
}
@Override
public IRefund getRefund() {
return new WechatRefund();
}
}
複製代碼
還能夠借鑑簡單工廠模式,建立一個"超級工廠類",根據不一樣參數獲取不一樣的具體工廠,方便使用者使用:
public class OrderFactoryProducer {
public static IOrderFactory getFactory(String type) {
switch (type) {
case "alipay":
return new AliOrderFactory();
case "wechat":
return new WechatOrderFactory();
default:
return null;
}
}
}
複製代碼
說明:【簡單工廠模式】的最大缺點就是負責了全部具體產品的建立,而這裏則不一樣,具體產品的建立已交由具體工廠去建立,"超級工廠類" 只負責找到合適的具體工廠,與產品沒有直接關係。固然,」超級工廠類「這種方式方式仍是不符合開閉原則的,需本身權衡利弊,我的感受至少比讓使用者直接使用具體工廠要好控制一些。
使用:
public static void main(String[] args) {
// 抽象工廠
// IOrderFactory orderFactory = OrderFactoryProducer.getFactory("alipay");
IOrderFactory orderFactory = OrderFactoryProducer.getFactory("wechat");
orderFactory.getPay().order();
orderFactory.getRefund().refund();
}
複製代碼
若是文章對您有所幫助, 請不吝點擊關注一下個人微信公衆號:FSA全棧行動, 這將是對我最大的激勵. 公衆號不只有Android技術, 還有iOS, Python等文章, 可能有你想要了解的技能知識點哦~