Java設(shè)計(jì)模式-工廠模式

簡介
工廠模式是一種常見的設(shè)計(jì)模式,用于創(chuàng)建對(duì)象的過程中,通過工廠類來封裝對(duì)象的創(chuàng)建過程。其核心思想是將對(duì)象的創(chuàng)建和使用分離,從而降低耦合度,提高代碼的可維護(hù)性和可擴(kuò)展性。工廠模式通常包括三種類型:簡單工廠、工廠方法和抽象工廠。
工廠模式與其他設(shè)計(jì)模式的主要區(qū)別在于,它是一種創(chuàng)建型模式,用于創(chuàng)建對(duì)象的過程中,通過工廠類來封裝對(duì)象的創(chuàng)建過程。與之類似的還有單例模式、建造者模式等。工廠模式主要用于以下兩個(gè)方面:
對(duì)象的創(chuàng)建和使用分離:將對(duì)象的創(chuàng)建過程封裝到工廠類中,避免了客戶端直接依賴具體的產(chǎn)品類,從而提高了代碼的可維護(hù)性和可擴(kuò)展性。
創(chuàng)建多個(gè)產(chǎn)品族或產(chǎn)品等級(jí)結(jié)構(gòu):當(dāng)需要?jiǎng)?chuàng)建多個(gè)產(chǎn)品族或產(chǎn)品等級(jí)結(jié)構(gòu)時(shí),工廠模式可以提供一個(gè)統(tǒng)一的接口,方便客戶端進(jìn)行調(diào)用。
實(shí)現(xiàn)
假設(shè)我們有一個(gè)簡單的電子商務(wù)平臺(tái),需要提供多種不同的支付方式,如支付寶、微信支付、銀行卡支付等。為了實(shí)現(xiàn)這一需求,我們可以使用工廠模式來封裝不同支付方式的創(chuàng)建過程,代碼如下:
interface Payment {
? ?void pay();
}
class Alipay implements Payment {
? ?@Override
? ?public void pay() {
? ? ? ?System.out.println("使用支付寶支付");
? ?}
}
class Wechatpay implements Payment {
? ?@Override
? ?public void pay() {
? ? ? ?System.out.println("使用微信支付");
? ?}
}
class PaymentFactory {
? ?public static Payment createPayment(String paymentType) {
? ? ? ?if ("alipay".equals(paymentType)) {
? ? ? ? ? ?return new Alipay();
? ? ? ?} else if ("wechatpay".equals(paymentType)) {
? ? ? ? ? ?return new Wechatpay();
? ? ? ?} else {
? ? ? ? ? ?throw new IllegalArgumentException("不支持的支付方式");
? ? ? ?}
? ?}
}
class Client {
? ?public static void main(String[] args) {
? ? ? ?Payment payment = PaymentFactory.createPayment("alipay");
? ? ? ?payment.pay();
? ?}
}
上述代碼中,我們首先定義了一個(gè)支付接口 Payment
,并提供了不同的實(shí)現(xiàn)類 Alipay
和 Wechatpay
。接著,我們創(chuàng)建了一個(gè)工廠類 PaymentFactory
,其中提供了一個(gè)靜態(tài)方法 createPayment
,用于創(chuàng)建不同的支付方式。最后,在客戶端代碼中,我們只需要通過工廠類 PaymentFactory
來獲取不同的支付方式,從而實(shí)現(xiàn)了對(duì)象的創(chuàng)建和使用分離。
優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
封裝對(duì)象的創(chuàng)建過程:工廠模式將對(duì)象的創(chuàng)建過程封裝到工廠類中,避免了客戶端直接依賴具體的產(chǎn)品類,從而提高了代碼的可維護(hù)性和可擴(kuò)展性。
創(chuàng)建多個(gè)產(chǎn)品族或產(chǎn)品等級(jí)結(jié)構(gòu):當(dāng)需要?jiǎng)?chuàng)建多個(gè)產(chǎn)品族或產(chǎn)品等級(jí)結(jié)構(gòu)時(shí),工廠模式可以提供一個(gè)統(tǒng)一的接口,方便客戶端進(jìn)行調(diào)用。
符合開閉原則:當(dāng)需要添加新的產(chǎn)品時(shí),只需要增加相應(yīng)的產(chǎn)品類和工廠方法即可,不需要修改原有的代碼,符合開閉原則。
缺點(diǎn)
增加代碼復(fù)雜度:工廠模式需要增加額外的工廠類,增加了代碼的復(fù)雜度。
增加系統(tǒng)的抽象性和理解難度:由于工廠模式引入了抽象層,因此增加了系統(tǒng)的抽象性和理解難度。
運(yùn)用場(chǎng)景
工廠模式適用于以下場(chǎng)景:
需要?jiǎng)?chuàng)建多個(gè)產(chǎn)品族或產(chǎn)品等級(jí)結(jié)構(gòu):當(dāng)需要?jiǎng)?chuàng)建多個(gè)產(chǎn)品族或產(chǎn)品等級(jí)結(jié)構(gòu)時(shí),工廠模式可以提供一個(gè)統(tǒng)一的接口,方便客戶端進(jìn)行調(diào)用。
需要封裝對(duì)象的創(chuàng)建過程:當(dāng)對(duì)象的創(chuàng)建過程比較復(fù)雜,或者需要依賴其他類的時(shí)候,可以使用工廠模式來封裝對(duì)象的創(chuàng)建過程。
需要?jiǎng)討B(tài)切換產(chǎn)品:當(dāng)需要?jiǎng)討B(tài)切換產(chǎn)品時(shí),工廠模式可以提供一個(gè)統(tǒng)一的接口,方便客戶端進(jìn)行調(diào)用。