python设计模式之抽象工厂模式详解

抽象工厂模式(Abstract Factory Pattern):属于创建型模式,它提供了一种创建对象的最佳方式。在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类,每个生成的工厂都能按照工厂模式提供对象。

意图: 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

主要解决: 主要解决接口选择的问题。

何时使用: 系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。

如何解决: 在一个产品族里面,定义多个产品。

关键代码: 在一个工厂里聚合多个同类产品。

优点: 当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。抽象工厂模式相较于工厂模式,划分更加明确清晰,面对复杂的生产任务,管理和生产性能会更加高效。

缺点: 产品族扩展非常困难,要增加一整个系列的某一产品。

注意事项: 产品族难扩展,产品等级易扩展。

应用实例: 对于一个生产水果的工厂,工厂模式主要针对一种水果创建一个涵盖与该水果相关所有业务的工厂(例如:葡萄的运输、保存、加工、包装、售卖等相关业务全部被该工厂承包);而抽象工厂模式主要针对生产其中的某一环节进行创建相应的工厂(例如:运输工厂负责管理所有水果的运输,售卖工厂负责管理所有水果的价格和售卖,库存工厂负责管理所有水果的库存计数等)。



那我们来一起使用抽象工厂模式,构建一个购买水果的收银小项目吧!(づ。◕ᴗᴗ◕。)づ

实现的思路

项目的主体包含6个部分:消费者(买水果的人),水果工厂(卖水果的人),水果工厂旗下的子工厂(品种工厂、价格工厂、包装工厂、称重工厂消费者主要向水果工厂传达“购买需求”的相关信息(水果的种类、包装、重量等…);水果工厂主要针对消费者的不同“购买需求”将任务分派给子工厂进行执行;品种工厂负责管理水果的种类,价格工厂负责管理水果的价格,称重工厂负责水果的称重,包装工厂负责水果的包装方式。

项目的UML用例图如下:

实现的代码如下:

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("您购买的水果为:%s" % self.name)

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

    def print_name(self):
        print("您购买的水果为:%s" % self.name)

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

    def print_name(self):
        print("您购买的水果为:%s" % self.name)

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

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

class FruitPrice:
    # 价格工厂
    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:
    # 橘子价格类
    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("该水果的单价为:%.2f元/千克" % self.price)

class Hami_MelonPrice:
    # 哈密瓜价格类
    def __init__(self):
        self.price = 24.3

    def print_price(self):
        print("该水果的价格为:%.2f元/千克" % self.price)

class GrapePrice:
    # 葡萄价格类
    def __init__(self):
        self.price = 16.2

    def print_price(self):
        print("该水果的价格为:%.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):
        # 任务的分配,品种、重量、价格、包装方式
        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):
        # 计算购买的金额
        money = self.price_object.price * self.weight_object.weight
        print("需要支付的金额共计为:%.2f元" % money)

    def show_info(self):
        # 展示最终的购买信息
        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:
    # 消费者类
    def __init__(self):
        print("-*-" * 20)
        # 输入原始的“购买需求”信息
        self.name = input("请输入你要购买的水果名称:0.橘子 1.哈密瓜 2.葡萄\n")
        self.weight = input("请输入你要购买水果的重量(kg):\n")
        self.variety = input("如果您购买橘子,我们有2种橘子:0.不买橘子 1.甘橘 2.砂糖橘\n")
        self.pack = input("请您选择该水果的包装方式:1.散称 2.盒装\n")
        print("-*-" * 20)

    def request(self):
        # 返回相关的购买信息
        return self.name, self.weight, self.variety, self.pack

if __name__ == '__main__':
    # 创建顾客
    buyer = Consumer()
    # 拿到顾客的购买信息
    buy_info = buyer.request()
    # 使用水果工厂,传达指令至旗下的子工厂并执行购买操作
    buy_res = FruitFactory(int(buy_info[0]), int(buy_info[1]), int(buy_info[2]), int(buy_info[3]))
    # 购买信息的展示
    buy_res.show_info()

相关的测试用例:

本文关于设计模式的讲解思想,参考链接:抽象工厂模式
如果有对python类的创建和继承等用法还不熟悉的小伙伴,请参考这篇博客: python类的继承

到此这篇关于python设计模式之抽象工厂模式的文章就介绍到这了,更多相关python抽象工厂模式内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 举例讲解Python设计模式编程的代理模式与抽象工厂模式

    代理模式 Proxy模式是一种常用的设计模式,它主要用来通过一个对象(比如B)给一个对象(比如A) 提供'代理'的方式方式访问.比如一个对象不方便直接引用,代理就在这个对象和访问者之间做了中介 你先设想:一个对象提供rgb三种颜色值,我想获得一个对象的rgb三种颜色,但是我不想让你获得蓝色属性,怎么办? class Proxy(object): def __init__(self, subject): self.__subject = subject # 代理其实本质上就是属性的委托 def _

  • 举例讲解Python设计模式编程中对抽象工厂模式的运用

    抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 优点:易于交换"产品系列",只要更改相应的工厂即可. 缺点:建立产品的时候很繁琐,需要增加和修改很多东西. 优化1:为了避免客户端有过多的逻辑判断,可以封装出一个简单工厂类来生成产品类. 优化2:为了减少简单工厂类里面的逻辑判断,可以采用"反射"机制,直接根据外部的配置文件读取出需要使用产品类的信息. #encoding=utf-8 # #by panda #抽象工厂模式 def p

  • Python设计模式之抽象工厂模式

    python面向对象编程入门,我们需要不断学习进步 """抽象工厂模式的实现""" import random class PetShop: """宠物商店""" def __init__(self, animal_factory=None): """宠物工厂是我们的抽象工厂.我们可以随意设置.""" self.pet_fact

  • Python设计模式之抽象工厂模式原理与用法详解

    本文实例讲述了Python设计模式之抽象工厂模式原理与用法.分享给大家供大家参考,具体如下: 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的类 下面是一个抽象工厂的demo: #!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = 'Andy' """ 大话设计模式 设计模式--抽象工厂模式 抽象工厂模式(Abstract Factory

  • python设计模式之抽象工厂模式详解

    抽象工厂模式(Abstract Factory Pattern):属于创建型模式,它提供了一种创建对象的最佳方式.在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类,每个生成的工厂都能按照工厂模式提供对象. 意图: 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 主要解决: 主要解决接口选择的问题. 何时使用: 系统的产品有多于一个的产品族,而系统只消费其中某一族的产品. 如何解决: 在一个产品族里面,定义多个产品. 关键代码: 在一个工厂里聚合多个

  • Java设计模式之抽象工厂模式详解

    一.什么是抽象工厂模式 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类,这称之为抽象工厂模式(Abstract Factory).我们并不关心零件的具体实现,而是只关心接口(API).我们仅使用该接口(API)将零件组装称为产品. 二.示例程序   1.抽象的零件:Item类 package com.as.module.abstractfactory; /** * 抽象的零件 * @author Andy * @date 2021/4/29 23:16 */ public

  • Android编程设计模式之抽象工厂模式详解

    本文实例讲述了Android编程设计模式之抽象工厂模式.分享给大家供大家参考,具体如下: 一.介绍 抽象工厂模式(Abstract Factory Pattern),也是创建型设计模式之一.前一节我们已经了解了工厂方法模式,那么这个抽象工厂又是怎么一回事呢?大家联想一下现实生活中的工厂肯定都是具体的,也就是说每个工厂都会生产某一种具体的产品,那么抽象工厂意味着生产出来的产品是不确定的,那这岂不是很奇怪?抽象工厂模式起源于以前对不同操作系统的图形化解决方案,如不同操作系统中的按钮和文本框控件其实现

  • Java工厂模式之简单工厂,工厂方法,抽象工厂模式详解

    目录 1.简单工厂模式 1.定义 2.代码案例 3.适用场景 4.优缺点 2.工厂方法模式 1.定义 2.代码案例 3.适用场景 4.优缺点 3.抽象工厂模式 1.定义 2.代码案例 3.适用场景 4.优缺点 4.总结 1.简单工厂模式 1.定义 简单工厂模式(Simple Factory Pattern)是指由一个工厂对象决定创建出哪一种产品类的实例.属于创建型模式,但它不属于GOF23种设计模式. 2.代码案例 假设以罐头产品的制造为案例 第一步:定义罐头的顶层接口类ICanned /**

  • PHP实现设计模式中的抽象工厂模式详解

    抽象工厂模式(Abstact Factory)是一种常见的软件设计模式.该模式为一个产品族提供了统一的创建接口.当需要这个产品族的某一系列的时候,可以为此系列的产品族创建一个 具体的工厂类. [意图] 抽象工厂模式提供一个创建一系统相关或相互依赖对象的接口,而无需指定它们具体的类[GOF95] [抽象工厂模式结构图] [抽象工厂模式中主要角色] 抽象工厂(Abstract Factory)角色:它声明一个创建抽象产品对象的接口.通常以接口或抽象类实现,所有的具体工厂类必须实现这个接口或继承这个类

  • php设计模式之简单工厂模式详解

    本文以实例形式较为详细的介绍了PHP设计模式的简单工厂模式,对于进行PHP程序设计来说有很好的借鉴作用.具体如下: 一.概念 简单工厂模式 [静态工厂方法模式](Static Factory Method) 是类的创建模式 工厂模式的几种形态: 1.简单工厂模式(Simple Factory)又叫做 静态工厂方法模式(Static Factory Method) 2.工厂方法模式(Factory Method)又叫做 多态性工厂模式(Polymorphic Factory) 3.抽象工厂模式(A

  • Java设计模式之静态工厂模式详解

    本文实例讲述了Java设计模式之静态工厂模式.分享给大家供大家参考,具体如下: 静态工厂模式(static factory)也叫简单工厂模式. 涉及到3个角色:工厂类角色,抽象产品类角色和具体产品类角色. 抽象产品类可以使用接口或者父类来描述产品对象的行为特征. 具体产品类就是某一具体的对象. 静态工厂类有一个静态的方法,含有判断逻辑,决定要创建哪一种具体的产品对象. 其设计模式如下: 抽象产品类  IProduct package org.test.design.sf; public inte

  • java设计模式--三种工厂模式详解

    目录 简单工厂 代码: 1.产品接口 2.产品接口实现子类 3.简单工厂类 4.调用工厂 5.测试 工厂方法 代码: 1.工厂接口 2.工厂实现子类 3.产品接口 4.产品实现子类 5.调用 6.测试 1.产品接口 2.产品抽象子类-普通产品 抽象工厂 3.1产品抽象子类-魔法产品 4.工厂接口 5.工厂实现子类-普通工厂 6.工厂实现子类-魔法工厂 7.调用 8.测试 总结 简单工厂 简单工厂模式是属于创建型模式,是工厂模式的一种.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例.定义

随机推荐