欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python設(shè)計(jì)模式之抽象工廠模式詳解

 更新時(shí)間:2021年07月06日 09:11:32   作者:Spuer_Tiger  
這篇文章主要介紹了python設(shè)計(jì)模式之抽象工廠模式,通過案例分析,主要說明了該項(xiàng)設(shè)計(jì)模式的主要解決問題,優(yōu)缺點(diǎn)以及何時(shí)使用等,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下

抽象工廠模式(Abstract Factory Pattern):屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的最佳方式。在抽象工廠模式中,接口是負(fù)責(zé)創(chuàng)建一個(gè)相關(guān)對(duì)象的工廠,不需要顯式指定它們的類,每個(gè)生成的工廠都能按照工廠模式提供對(duì)象。

意圖: 提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對(duì)象的接口,而無需指定它們具體的類。

主要解決: 主要解決接口選擇的問題。

何時(shí)使用: 系統(tǒng)的產(chǎn)品有多于一個(gè)的產(chǎn)品族,而系統(tǒng)只消費(fèi)其中某一族的產(chǎn)品。

如何解決: 在一個(gè)產(chǎn)品族里面,定義多個(gè)產(chǎn)品。

關(guān)鍵代碼: 在一個(gè)工廠里聚合多個(gè)同類產(chǎn)品。

優(yōu)點(diǎn): 當(dāng)一個(gè)產(chǎn)品族中的多個(gè)對(duì)象被設(shè)計(jì)成一起工作時(shí),它能保證客戶端始終只使用同一個(gè)產(chǎn)品族中的對(duì)象。抽象工廠模式相較于工廠模式,劃分更加明確清晰,面對(duì)復(fù)雜的生產(chǎn)任務(wù),管理和生產(chǎn)性能會(huì)更加高效。

缺點(diǎn): 產(chǎn)品族擴(kuò)展非常困難,要增加一整個(gè)系列的某一產(chǎn)品。

注意事項(xiàng): 產(chǎn)品族難擴(kuò)展,產(chǎn)品等級(jí)易擴(kuò)展。

應(yīng)用實(shí)例: 對(duì)于一個(gè)生產(chǎn)水果的工廠,工廠模式主要針對(duì)一種水果創(chuàng)建一個(gè)涵蓋與該水果相關(guān)所有業(yè)務(wù)的工廠(例如:葡萄的運(yùn)輸、保存、加工、包裝、售賣等相關(guān)業(yè)務(wù)全部被該工廠承包);而抽象工廠模式主要針對(duì)生產(chǎn)其中的某一環(huán)節(jié)進(jìn)行創(chuàng)建相應(yīng)的工廠(例如:運(yùn)輸工廠負(fù)責(zé)管理所有水果的運(yùn)輸,售賣工廠負(fù)責(zé)管理所有水果的價(jià)格和售賣,庫(kù)存工廠負(fù)責(zé)管理所有水果的庫(kù)存計(jì)數(shù)等)。

在這里插入圖片描述


那我們來一起使用抽象工廠模式,構(gòu)建一個(gè)購(gòu)買水果的收銀小項(xiàng)目吧!(づ。◕ᴗᴗ◕。)づ

實(shí)現(xiàn)的思路

項(xiàng)目的主體包含6個(gè)部分:消費(fèi)者(買水果的人),水果工廠(賣水果的人),水果工廠旗下的子工廠(品種工廠、價(jià)格工廠、包裝工廠、稱重工廠消費(fèi)者主要向水果工廠傳達(dá)“購(gòu)買需求”的相關(guān)信息(水果的種類、包裝、重量等…);水果工廠主要針對(duì)消費(fèi)者的不同“購(gòu)買需求”將任務(wù)分派給子工廠進(jìn)行執(zhí)行;品種工廠負(fù)責(zé)管理水果的種類,價(jià)格工廠負(fù)責(zé)管理水果的價(jià)格,稱重工廠負(fù)責(zé)水果的稱重,包裝工廠負(fù)責(zé)水果的包裝方式。

項(xiàng)目的UML用例圖如下:

在這里插入圖片描述

實(shí)現(xiàn)的代碼如下:

class FruitClass:
    # 品種工廠
    def get_name(self, name_index):
        if name_index == 0:
            name_object = OrangeClass()
        elif name_index == 1:
            name_object = Hami_MelonClass()
        elif name_index == 2:
            name_object = GrapeClass()
        else:
            name_object = None

        return name_object


class OrangeClass:
    # 橘子類
    def __init__(self):
        self.name = "橘子"

    def print_name(self):
        print("您購(gòu)買的水果為:%s" % self.name)


class Hami_MelonClass:
    # 哈密瓜類
    def __init__(self):
        self.name = "哈密瓜"

    def print_name(self):
        print("您購(gòu)買的水果為:%s" % self.name)


class GrapeClass:
    # 葡萄類
    def __init__(self):
        self.name = "葡萄"

    def print_name(self):
        print("您購(gòu)買的水果為:%s" % self.name)


class FruitWeight:
    # 稱重工廠
    def __init__(self, weight):
        self.weight = float(weight)

    def print_weight(self):
        print("該水果的重量為:%.2f千克" % self.weight)


class FruitPrice:
    # 價(jià)格工廠
    def get_price(self, name_index, variety):
        if name_index == 0:
            price_object = OrangePrice(variety)
        elif name_index == 1:
            price_object = Hami_MelonPrice()
        elif name_index == 2:
            price_object = GrapePrice()
        else:
            price_object = None

        return price_object


class OrangePrice:
    # 橘子價(jià)格類
    def __init__(self, variety):
        self.variety = variety
        if self.variety == 1:
            self.price = 8.5
        else:
            self.price = 11.0

    def print_price(self):
        print("該水果的單價(jià)為:%.2f元/千克" % self.price)


class Hami_MelonPrice:
    # 哈密瓜價(jià)格類
    def __init__(self):
        self.price = 24.3

    def print_price(self):
        print("該水果的價(jià)格為:%.2f元/千克" % self.price)


class GrapePrice:
    # 葡萄價(jià)格類
    def __init__(self):
        self.price = 16.2

    def print_price(self):
        print("該水果的價(jià)格為:%.2f元/千克" % self.price)
        return self.price


class FruitPack:
    # 包裝工廠
    def __init__(self, pack):
        if pack == 1:
            self.pack = "散稱"
        else:
            self.pack = "盒裝"

    def print_pack(self):
        print("該水果的打包方式為:%s" % self.pack)


class FruitFactory:
    def __init__(self, name_index, weight, variety, pack):
        # 任務(wù)的分配,品種、重量、價(jià)格、包裝方式
        self.name_object = FruitClass().get_name(name_index)
        self.weight_object = FruitWeight(weight)
        self.price_object = FruitPrice().get_price(name_index, variety)
        self.pack_object = FruitPack(pack)

    def print_purchase(self):
        # 計(jì)算購(gòu)買的金額
        money = self.price_object.price * self.weight_object.weight
        print("需要支付的金額共計(jì)為:%.2f元" % money)

    def show_info(self):
        # 展示最終的購(gòu)買信息
        self.name_object.print_name()
        self.weight_object.print_weight()
        self.price_object.print_price()
        self.pack_object.print_pack()
        self.print_purchase()
        print("-*-" * 20)


class Consumer:
    # 消費(fèi)者類
    def __init__(self):
        print("-*-" * 20)
        # 輸入原始的“購(gòu)買需求”信息
        self.name = input("請(qǐng)輸入你要購(gòu)買的水果名稱:0.橘子 1.哈密瓜 2.葡萄\n")
        self.weight = input("請(qǐng)輸入你要購(gòu)買水果的重量(kg):\n")
        self.variety = input("如果您購(gòu)買橘子,我們有2種橘子:0.不買橘子 1.甘橘 2.砂糖橘\n")
        self.pack = input("請(qǐng)您選擇該水果的包裝方式:1.散稱 2.盒裝\n")
        print("-*-" * 20)

    def request(self):
        # 返回相關(guān)的購(gòu)買信息
        return self.name, self.weight, self.variety, self.pack


if __name__ == '__main__':
    # 創(chuàng)建顧客
    buyer = Consumer()
    # 拿到顧客的購(gòu)買信息
    buy_info = buyer.request()
    # 使用水果工廠,傳達(dá)指令至旗下的子工廠并執(zhí)行購(gòu)買操作
    buy_res = FruitFactory(int(buy_info[0]), int(buy_info[1]), int(buy_info[2]), int(buy_info[3]))
    # 購(gòu)買信息的展示
    buy_res.show_info()

相關(guān)的測(cè)試用例:

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

本文關(guān)于設(shè)計(jì)模式的講解思想,參考鏈接:抽象工廠模式
如果有對(duì)python類的創(chuàng)建和繼承等用法還不熟悉的小伙伴,請(qǐng)參考這篇博客: python類的繼承

到此這篇關(guān)于python設(shè)計(jì)模式之抽象工廠模式的文章就介紹到這了,更多相關(guān)python抽象工廠模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python實(shí)現(xiàn)隨機(jī)生成迷宮并自動(dòng)尋路

    Python實(shí)現(xiàn)隨機(jī)生成迷宮并自動(dòng)尋路

    最近在學(xué)習(xí)Python,正好今天在學(xué)習(xí)隨機(jī)數(shù),本文實(shí)現(xiàn)了Python實(shí)現(xiàn)隨機(jī)生成迷宮并自動(dòng)尋路,感興趣的可以了解一下
    2021-06-06
  • Python中byte字符串轉(zhuǎn)string的實(shí)現(xiàn)

    Python中byte字符串轉(zhuǎn)string的實(shí)現(xiàn)

    本文主要介紹了Python中byte字符串轉(zhuǎn)string的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • 基于Python利用Faker批量測(cè)試數(shù)據(jù)

    基于Python利用Faker批量測(cè)試數(shù)據(jù)

    這篇文章主要介紹了基于Python利用Faker批量測(cè)試數(shù)據(jù)。測(cè)試過程中,經(jīng)常需要批量去造數(shù)據(jù),方法有很多,最簡(jiǎn)單方便的應(yīng)該是使用python?的一個(gè)三方庫(kù)Faker。下面我們就來看看三方庫(kù)Faker如何批量測(cè)試數(shù)據(jù),需要的朋友可以參考一下
    2022-03-03
  • Python之lambda匿名函數(shù)及map和filter的用法

    Python之lambda匿名函數(shù)及map和filter的用法

    今天小編就為大家分享一篇關(guān)于Python之lambda匿名函數(shù)及map和filter的用法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • Python random庫(kù)使用方法及異常處理方案

    Python random庫(kù)使用方法及異常處理方案

    這篇文章主要介紹了python random庫(kù)使用方法及異常處理,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • 十個(gè)Python經(jīng)典小游戲的代碼合集

    十個(gè)Python經(jīng)典小游戲的代碼合集

    這篇文章主要為大家分享十個(gè)Python經(jīng)典的小游戲代碼,非常適合Python初學(xué)者練手。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以嘗試一下
    2022-05-05
  • 一篇文章搞懂python的轉(zhuǎn)義字符及用法

    一篇文章搞懂python的轉(zhuǎn)義字符及用法

    這篇文章主要介紹了一篇文章搞懂python的轉(zhuǎn)義字符及用法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Python結(jié)合spaCy?進(jìn)行簡(jiǎn)易自然語言處理

    Python結(jié)合spaCy?進(jìn)行簡(jiǎn)易自然語言處理

    這篇文章主要為大家介紹了Python結(jié)合spaCy進(jìn)行簡(jiǎn)易自然語言處理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Python使用gensim計(jì)算文檔相似性

    Python使用gensim計(jì)算文檔相似性

    在文本處理中,比如商品評(píng)論挖掘,有時(shí)需要了解每個(gè)評(píng)論分別和商品的描述之間的相似度,以此衡量評(píng)論的客觀性。那么python 里面有計(jì)算文本相似度的程序包嗎,恭喜你,不僅有,而且很好很強(qiáng)大。下面我們就來體驗(yàn)下gensim的強(qiáng)大
    2016-04-04
  • python繪制直線的方法

    python繪制直線的方法

    這篇文章主要為大家詳細(xì)介紹了python繪制直線的方法,繪制直線通用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-06-06

最新評(píng)論