python工廠方法模式原理與實(shí)現(xiàn)
一、簡(jiǎn)介
工廠模式是屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的最佳方式。
在工廠模式中,我們?cè)趧?chuàng)建對(duì)象的過(guò)程中不會(huì)向客戶端暴露實(shí)現(xiàn)邏輯,而是通過(guò)一個(gè)共同的接口類來(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)負(fù)責(zé)創(chuàng)建產(chǎn)品類的實(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è)元類,用于在Python程序中創(chuàng)建抽象基類,抽象基類中聲明的抽象方法,使用abstractmethod裝飾器裝飾。
簡(jiǎn)單明了的說(shuō):創(chuàng)建一個(gè)公共的抽象類,然后創(chuàng)建多個(gè)支付的類繼承這個(gè)抽象類,各種支付類里實(shí)現(xiàn)具體的支付方式,通過(guò)工廠類選擇支付方式,這樣客服端只實(shí)現(xiàn)支付方式,不需要知道具體的實(shí)現(xiàn)方法。
優(yōu)點(diǎn):
隱藏了對(duì)象創(chuàng)建的實(shí)現(xiàn)細(xì)節(jié)客戶端不需要修改代碼
缺點(diǎn):
違反了單一職責(zé)原則,將創(chuàng)建邏輯集中到一個(gè)工廠類里當(dāng)添加新產(chǎn)品時(shí),需要修改工廠類代碼,違反了開(kāi)閉原則
四、工廠模式
內(nèi)容:定義了一個(gè)用于創(chuàng)建對(duì)象的接口(工廠類),讓工廠子類決定實(shí)例化哪一個(gè)產(chǎn)品類。
具體代碼(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)創(chuàng)建一系列相關(guān)或者相互依賴的對(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("蘋果手機(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("蘋果CPU")
class AppleOS(OS):
def show_os(self):
print("蘋果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):
將客戶端與類的具體實(shí)現(xiàn)相分離每個(gè)工廠創(chuàng)建了一個(gè)完整的產(chǎn)品系列,使得易于交換產(chǎn)品系列有利于產(chǎn)品的一致性(及產(chǎn)品之間的約束關(guān)系)
缺點(diǎn):
難以支持新種類的抽象產(chǎn)品
總結(jié)
到此這篇關(guān)于python工廠方法模式原理與實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)python工廠方法模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
django 2.2和mysql使用的常見(jiàn)問(wèn)題
這篇文章主要介紹了django 2.2和mysql使用的常見(jiàn)問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07
Python中schedule模塊關(guān)于定時(shí)任務(wù)使用方法
這篇文章主要介紹了Python中schedule模塊關(guān)于定時(shí)任務(wù)使用方法,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-05-05
Python+Kepler.gl輕松制作酷炫路徑動(dòng)畫的實(shí)現(xiàn)示例
這篇文章主要介紹了Python+Kepler.gl輕松制作酷炫路徑動(dòng)畫的實(shí),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧現(xiàn)示例2020-06-06
使用OpenCV實(shí)現(xiàn)迷宮解密的全過(guò)程
同學(xué)發(fā)了我張迷宮圖片,讓我走迷宮來(lái)緩解暴躁,于是乎就碼了一個(gè)程序出來(lái),下面這篇文章主要給大家介紹了關(guān)于使用OpenCV實(shí)現(xiàn)迷宮解密的相關(guān)資料,需要的朋友可以參考下2022-10-10
把大數(shù)據(jù)數(shù)字口語(yǔ)化(python與js)兩種實(shí)現(xiàn)
當(dāng)出現(xiàn)萬(wàn)以上的整型數(shù)字時(shí),經(jīng)常要把它們口語(yǔ)化比較直觀。下面分享兩段代碼,python與js的2013-02-02
Python?Setuptools的?setup.py實(shí)例詳解
setup.py是一個(gè)?python?文件,它的存在表明您要安裝的模塊/包可能已經(jīng)用?Setuptools?打包和分發(fā),這是分發(fā)?Python?模塊的標(biāo)準(zhǔn)。?它的目的是正確安裝軟件,本文給大家講解Python?Setuptools的?setup.py感興趣的朋友跟隨小編一起看看吧2022-12-12
python實(shí)現(xiàn)簡(jiǎn)單登陸流程的方法
下面小編就為大家分享一篇python實(shí)現(xiàn)簡(jiǎn)單登陸流程的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-04-04

