網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
一、簡(jiǎn)介
工廠模式是屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的最佳方式。
在工廠模式中,我們?cè)趧?chuàng)建對(duì)象的過(guò)程中不會(huì)向客戶端暴露實(shí)現(xiàn)邏輯,而是通過(guò)一個(gè)共同的接口類(lèi)來(lái)指向新創(chuàng)建的對(duì)象。
二、工廠方法模式的主要角色
抽象工廠(Abstract Factory):提供了創(chuàng)建產(chǎn)品的接口,調(diào)用者通過(guò)它訪問(wèn)具體工廠的工廠方法newProduct()來(lái)創(chuàng)建產(chǎn)品。
具體工廠(ConcreteFactory):主要實(shí)現(xiàn)抽象工廠中的抽象方法,完成具體產(chǎn)品的創(chuàng)建。
抽象產(chǎn)品(Product):定義了產(chǎn)品的規(guī)范,描述了產(chǎn)品的主要特性和功能。
具體產(chǎn)品(ConcreteProduct):實(shí)現(xiàn)了抽象產(chǎn)品定義的接口,由具體工廠來(lái)創(chuàng)建,它同具體工廠之間一一對(duì)應(yīng)。
三、簡(jiǎn)單工廠模式
內(nèi)容:不直接向客戶端暴露對(duì)象創(chuàng)建實(shí)現(xiàn)的細(xì)節(jié),而是通過(guò)工廠類(lèi)來(lái)負(fù)責(zé)創(chuàng)建產(chǎn)品類(lèi)的實(shí)例。
具體代碼(jiandan.py):
from abc import ABCMeta, abstractmethod class Payment(metaclass=ABCMeta): @abstractmethod def pay(self): pass class WechatPay(Payment): def pay(self, money): print("微信支付%s" % money) return class Alipay(Payment): def __init__(self, huabei=False): self.huabei = huabei def pay(self, money): if self.huabei: print("花唄支付%s" % money) else: print("支付寶余額支付%s" % money) class PaymentFactory: def create_pay(self, method): if method == "wechat": return WechatPay() elif method == "alipay": return Alipay() elif method == "huabei": return Alipay(huabei=True) else: raise TypeError("No such payment name %s" % method) # client pf = PaymentFactory() p = pf.create_pay("huabei") p.pay(100)
結(jié)果:
ABCMeta是python的一個(gè)元類(lèi),用于在Python程序中創(chuàng)建抽象基類(lèi),抽象基類(lèi)中聲明的抽象方法,使用abstractmethod裝飾器裝飾。
簡(jiǎn)單明了的說(shuō):創(chuàng)建一個(gè)公共的抽象類(lèi),然后創(chuàng)建多個(gè)支付的類(lèi)繼承這個(gè)抽象類(lèi),各種支付類(lèi)里實(shí)現(xiàn)具體的支付方式,通過(guò)工廠類(lèi)選擇支付方式,這樣客服端只實(shí)現(xiàn)支付方式,不需要知道具體的實(shí)現(xiàn)方法。
優(yōu)點(diǎn):
隱藏了對(duì)象創(chuàng)建的實(shí)現(xiàn)細(xì)節(jié)客戶端不需要修改代碼
缺點(diǎn):
違反了單一職責(zé)原則,將創(chuàng)建邏輯集中到一個(gè)工廠類(lèi)里當(dāng)添加新產(chǎn)品時(shí),需要修改工廠類(lèi)代碼,違反了開(kāi)閉原則?
四、工廠模式
內(nèi)容:定義了一個(gè)用于創(chuàng)建對(duì)象的接口(工廠類(lèi)),讓工廠子類(lèi)決定實(shí)例化哪一個(gè)產(chǎn)品類(lèi)。
具體代碼(factory_method.py):
from abc import ABCMeta, abstractmethod class Payment(metaclass=ABCMeta): @abstractmethod def pay(self): pass class WechatPay(Payment): def pay(self, money): print("微信支付%s" % money) return class Alipay(Payment): def __init__(self, huabei=False): self.huabei = huabei def pay(self, money): if self.huabei: print("花唄支付%s" % money) else: print("支付寶余額支付%s" % money) class PaymentFactory(metaclass=ABCMeta): @abstractmethod def create_method(self): pass class AlipayFactory(PaymentFactory): def create_method(self): return Alipay() class WechatFactory(PaymentFactory): def create_method(self): return WechatPay() class HuabeiFactory(PaymentFactory): def create_method(self): return Alipay(huabei=True) pf = HuabeiFactory() p = pf.create_method() p.pay(100)
結(jié)果:
五、抽象工廠模式
?內(nèi)容:定義一個(gè)工廠類(lèi)接口,讓工廠子類(lèi)來(lái)創(chuàng)建一系列相關(guān)或者相互依賴(lài)的對(duì)象。
與工廠模式相比,抽象工廠模式中的每一個(gè)產(chǎn)品都生產(chǎn)一套產(chǎn)品。
具體代碼(abstract_factory.py):
from abc import ABCMeta, abstractmethod """ 抽象產(chǎn)品 """ class PhoneShell(metaclass=ABCMeta): @abstractmethod def show_shell(self): pass class OS(metaclass=ABCMeta): @abstractmethod def show_os(self): pass class CPU(metaclass=ABCMeta): @abstractmethod def show_cpu(self): pass # 抽象工廠 class PhoneFactory(metaclass=ABCMeta): @abstractmethod def make_shell(self): pass @abstractmethod def make_cpu(self): pass @abstractmethod def make_os(self): pass # 具體產(chǎn)品 class SmallShell(PhoneShell): def show_shell(self): print("普通手機(jī)殼小手機(jī)殼") class BigShell(PhoneShell): def show_shell(self): print("普通手機(jī)殼大手機(jī)殼") class AppleShell(PhoneShell): def show_shell(self): print("蘋(píng)果手機(jī)殼") class SnapDragonCPU(CPU): def show_cpu(self): print("驍龍CPU") class MediaTekCPU(CPU): def show_cpu(self): print("聯(lián)發(fā)科CPU") class AppleCPU(CPU): def show_cpu(self): print("蘋(píng)果CPU") class AppleOS(OS): def show_os(self): print("蘋(píng)果OS系統(tǒng)") class AndroidOS(OS): def show_os(self): print("Android系統(tǒng)") class IOS(OS): def show_os(self): print("IOS系統(tǒng)") # 具體工廠 class MiFactory(PhoneFactory): def make_cpu(self): return SnapDragonCPU() def make_os(self): return AndroidOS() def make_shell(self): return BigShell() class HuaweiFactory(PhoneFactory): def make_cpu(self): return MediaTekCPU() def make_os(self): return AndroidOS() def make_shell(self): return SmallShell() class IPhoneFactory(PhoneFactory): def make_cpu(self): return AppleCPU() def make_os(self): return AppleOS() def make_shell(self): return AppleShell() class Phone: def __init__(self, cpu, os, shell): self.cpu = cpu self.os = os self.shell = shell def show_info(self): print("手機(jī)信息:") self.cpu.show_cpu() self.os.show_os() self.shell.show_shell() def make_phone(factory): cpu = factory.make_cpu() os = factory.make_os() shell = factory.make_shell() return Phone(cpu, os, shell) p1 = make_phone(MiFactory()) p1.show_info()
結(jié)果:
優(yōu)點(diǎn):
將客戶端與類(lèi)的具體實(shí)現(xiàn)相分離每個(gè)工廠創(chuàng)建了一個(gè)完整的產(chǎn)品系列,使得易于交換產(chǎn)品系列有利于產(chǎn)品的一致性(及產(chǎn)品之間的約束關(guān)系)
缺點(diǎn):
難以支持新種類(lèi)的抽象產(chǎn)品
總結(jié)
原文鏈接:https://blog.csdn.net/qq_45758854/article/details/122956626
相關(guān)推薦
- 2022-12-12 C語(yǔ)言scanf語(yǔ)句吃掉回車(chē)或者空格問(wèn)題及解決_C 語(yǔ)言
- 2022-12-05 Android實(shí)現(xiàn)滑動(dòng)折疊Header全流程詳解_Android
- 2022-03-26 c#使用listbox的詳細(xì)方法和常見(jiàn)問(wèn)題解決_C#教程
- 2022-07-12 如何利用python實(shí)現(xiàn)kmeans聚類(lèi)_python
- 2022-08-26 一篇文章學(xué)會(huì)GO語(yǔ)言中的變量_Golang
- 2022-10-30 詳解Golang如何實(shí)現(xiàn)一個(gè)環(huán)形緩沖器_Golang
- 2022-07-22 yaml文件的加載使用
- 2023-04-22 Python中DataFrame與內(nèi)置數(shù)據(jù)結(jié)構(gòu)相互轉(zhuǎn)換的實(shí)現(xiàn)_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支