Python与设计模式(一)——Abstract Factory

【设计模式】【创建型模式(Creational Patterns)】之抽象工厂模式(Abstract Factory Pattern) 工厂方法模式通过定义一个创建对象的接口,但由子类决定实例化哪一个类,从而使得系统更加灵活和可扩展。这种方法不仅遵循了开闭原则(对扩展开放,对修改关闭),还降低了客户端与具体产品之间的耦合度。然而,随着具体产品数量的增加,也会带来更多的具体创造者类,增加了系统的复杂度。因此,在实际应用中需要根据具体情况进行权衡。 阅读详情

最近在重新学习Python,想找一些优秀的Python源代码阅读学习,加上前段时间一直在学习设计模式,所以选择了GitHub上这个项目作为学习对象:

https://github.com/faif/python-patterns

这里有用Python实现各个设计模式的源代码demo。

本篇从Abstract Factory开始介绍。

其源码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# http://ginstrom.com/scribbles/2007/10/08/design-patterns-python-style/

"""Implementation of the abstract factory pattern"""
import six
import abc
import random


class PetShop(object):

    """A pet shop"""

    def __init__(self, animal_factory=None):
        """pet_factory is our abstract factory.  We can set it at will."""

        self.pet_factory = animal_factory

    def show_pet(self):
        """Creates and shows a pet using the abstract factory"""

        pet = self.pet_factory.get_pet()
        print("We have a lovely {}".format(pet))
        print("It says {}".format(pet.speak()))
        print("We also have {}".format(self.pet_factory.get_food()))


# Stuff that our factory makes

class Dog(object):

    def speak(self):
        return "woof"

    def __str__(self):
        return "Dog"


class Cat(object):

    def speak(self):
        return "meow"

    def __str__(self):
        return "Cat"


# Factory classes

class DogFactory(object):

    def get_pet(self):
        return Dog()

    def get_food(self):
        return "dog food"


class CatFactory(object):

    def get_pet(self):
        return Cat()

    def get_food(self):
        return "cat food"


# Create the proper family
def get_factory():
    """Let's be dynamic!"""
    return random.choice([DogFactory, CatFactory])()


# Implementation 2 of an abstract factory
@six.add_metaclass(abc.ABCMeta)
class Pet(object):

    @classmethod
    def from_name(cls, name):
        for sub_cls in cls.__subclasses__():
            if name == sub_cls.__name__.lower():
                return sub_cls()

    @abc.abstractmethod
    def speak(self):
        """"""


class Kitty(Pet):
    def speak(self):
        return "Miao"


class Duck(Pet):
    def speak(self):
        return "Quak"


# Show pets with various factories
if __name__ == "__main__":
    for i in range(3):
        shop = PetShop(get_factory())
        shop.show_pet()
        print("=" * 20)

    for name0 in ["kitty", "duck"]:
        pet = Pet.from_name(name0)
        print("{}: {}".format(name0, pet.speak()))

### OUTPUT ###
# We have a lovely Cat
# It says meow
# We also have cat food
# ====================
# We have a lovely Dog
# It says woof
# We also have dog food
# ====================
# We have a lovely Cat
# It says meow
# We also have cat food
# ====================
# kitty: Miao
# duck: Quak
代码对应的类图如下:

大家可能会感到奇怪:这里并没有抽象工厂啊?我们可以看这段代码:

# Create the proper family
def get_factory():
    """Let's be dynamic!"""
    return random.choice([DogFactory, CatFactory])()

这里,其实就实现了一个抽象工厂的功能,生成目标的factory。DogFactory用来生产Dog对象,CatFactory用来生产Cat对象。Dog类和Cat类都是Pet类的子类。


51、Python设计模式:Facade、Flyweight、Command与Abstract Factory 本文介绍了Python中四种重要的设计模式:外观模式(Facade Pattern)、享元模式(Flyweight Pattern)、命令模式(Command Pattern)和抽象工厂模式(Abstract Factory Pattern)。通过具体的代码示例,详细讲解了每种模式的实现方式和适用场景,并讨论了它们在实际开发中的选择与权衡。此外,还展示了这些设计模式的组合使用方式,帮助开发者提高代码的可读性、可维护性和性能。 阅读详情

相关推荐

抽象工厂模式(Abstract Factory Pattern)

✅ 抽象工厂负责生产“产品系列”,只换工厂,不动逻辑。适用于“同一风格的多组件系统”。如果你希望,我可以把这个例子替换成游戏皮肤工厂、汽车工厂、手机UI工厂来帮助你更贴近生活。你想试试哪个?🎮🚗📱。

qq_42889517的博客 1334

python 工厂模式之abstract factory(抽象工厂)

Abstract Factory模式   提供一个共同的接口来创建相互关联的多个对象。抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象。 不过使用抽象工厂是有条件的:1.系统中有多个产品族,而系统一次只可能消费其中一族产品2.同属于同一个产品族的产品在一起使用,这一约束必须在系统的设计中体现出来。 定义两个类,Dog和Cat,都拥有speak方法class Dog(obj...

果汁华的博客 637

ADRC自抗扰控制:工程抗扰“黑科技”,附C代码实战!

自抗扰控制(ADRC)是一种革新性的强鲁棒控制策略,通过主动估计和补偿系统扰动,无需精确数学模型即可实现优异控制性能。本文详细解析ADRC三大核心组件:跟踪微分器(TD)实现指令柔化,扩张状态观测器(ESO)实时估计总扰动,非线性状态反馈(NLSEF)完成动态补偿。针对二阶系统,文章提供完整的参数设计方法和C语言实现框架,包括关键函数fhan和fal的代码实现。ADRC将复杂对象"线性化"为积分器串联系统,显著提升抗扰能力,特别适用于电机控制、飞行器姿态等存在模型不确定性和强干扰的场景。

技术工作者 1736

Python设计模式系列之四: 创建型Abstract Factory模式

 2003 年 7 月 03 日软件设计大师总是要比初学者更加清楚该如何设计软件,因为他们手中掌握着设计模式这一法宝。作为一种高级的软件复用形式,设计模式是众多优秀软件设计师集体智慧的结晶,能够很好地指导软件设计过程。本系列文章讲述如何在用Python开发软件时应用各种设计模式,此次介绍的是创建型工厂方法(Factory Method)模式。一、简介抽象工厂(Abstract

450

银河麒麟V10 SP3下NFS客户端挂载失败?5个常见问题排查与修复

本文针对银河麒麟V10 SP3系统中NFS客户端挂载失败的常见问题,提供了5个实战排查方案。从基础服务状态检查到防火墙配置、版本兼容性、/etc/fstab设置及权限映射,详细解析了问题根源与解决方案,帮助用户快速恢复NFS文件共享功能。

weixin_42525005的博客 363

对于基本的捕鱼游戏设计思路(五)——鱼

今天讲捕鱼游戏里鱼的部分,也是比较关键的一部分。 一步一步来,先分析游戏,首先鱼是从屏幕外生成,然后它有个移动的动作,而且分为不同的类型。 然后就可以进入代码部分,首先设置一个计时器,控制时间生成鱼,而鱼分种类,所以就用到随机函数,随机输出一个值,传入switch语句,从而生成不同的鱼。 void GameScene::xiaoyuupdate(float dt){ Size visibl

Cineze的博客 1万+

Python实现设计模式--02.工厂模式(Factory Pattern)

《设计模式》涉及到创建类的几种模式,共同的也是最根本的原则就是:不要new 对象!!!既然如此,告诉我你最先想到的是如何得到对象呢?没错,“你不让我new,那你给我个get对象的工具吧,别的我不管”。这就是工厂模式,工厂模式是一种简单又实用的模式,在各大框架到处可见,比如Java世界大名鼎鼎的spring,其本身就是一个大工厂。 工厂模式中,工厂的作用是解耦调用者和被调用者的关系,工厂模式又分为工厂方法模式和简单工厂模式。

贤弟 6387

手把手教你用ES8311芯片搞定智能音箱TTS播放(附完整寄存器配置清单)

本文详细介绍了如何使用ES8311音频编解码芯片实现智能音箱TTS播放功能,包括芯片特性、硬件连接、寄存器配置及调试技巧。通过完整的寄存器配置清单和实战经验,帮助开发者快速掌握ES8311在智能音箱中的应用,优化音频输出质量和低功耗设计。

weixin_42567497的博客 558

抽象工厂(Abstract Factory)模式

抽象工厂(Abstract Factory)模式作者:吕震宇一、 抽象工厂(Abstract Factory)模式抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。为了方便引进抽象工厂模式,引进一个新概念:产品族(Product Family)。所谓产品族,是指位于不同产品等级结构,功能相关联的产品组成的家族。如图:图中一共有四个产品族,分布于三个不同的产品等级结构中。只要指明一个

zhyl_yg的专栏 1829

利用Langchain生成合成数据的实践指南

合成数据是相对于从真实世界事件中收集的数据而言的人工生成的数据。它用于模拟真实数据,同时避免隐私泄露或遇到真实数据中的局限性。:尽管合成数据有诸多优点,但应谨慎使用,因为它可能无法捕捉真实世界的复杂性。

eahba的博客 397

【100分】最长子字符串的长度

题目要求在一个环形字符串中找出字符 ‘o’ 出现了偶数次的最长子字符串长度。这里的字符串是一个环形的,即首尾相连。代码统计了字符串中字符 ‘o’ 的出现次数,并根据其奇偶性返回相应的最长子字符串长度。当 ‘o’ 的数量为偶数时,直接返回字符串长度;当 ‘o’ 的数量为奇数时,返回长度减去 1。给你一个字符串 s,字符串s首尾相连成一个环形 ,请你在环中找出 ‘o’ 字符出现了偶数次最长子字符串的长度。【最长子字符串的长度】

weixin_54707168的博客 896

python设计模式(2)-Abstract Factory(抽象工厂)

python,设计模式,Abstract Factory,简单工厂

keyhead的专栏 437

5-EP4CE10F17C8-引脚配置

EP4CE10F17C8-引脚配置

weixin_44479192的博客 719

设计模式-抽象工厂模式(Abstract Factory Pattern)

抽象工厂模式 定义 抽象工厂模式提供了一个创建一系列相关或者相互依赖对象的接口,无需指定它们具体的类。 现在看不明白没关系,坚持看到最后,并且把例子看懂,再来多体会几遍就能明白了。 类型 创建型。 适用场景 应用层不依赖于产品类实例如何被创建、实现等细节。 强调一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量的重复代码。 提供一个产品类的库,所有的产品以同样的接口出现,从而使得应用...

kaven 4903

Colmap论文——《Structure-from-Motion Revisited》论文阅读笔记

  最近又将Colmap论文翻出来仔细阅读总结了一下,于是顺便写个博客记录一下。Structure-from-Motion Revisited是当前SOTA的增量式SfM算法Colmap的论文,发表于2016年计算机视觉顶会CVPR。它是增量式SfM里程碑式的作品。 论文地址:https://openaccess.thecvf.com/content_cvpr_2016/papers/Schonberger_Structure-From-Motion_Revisited_CVPR_2016_paper.p

zeeq的博客 1万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

python 设计 实践_python实践设计模式(一)概述和工厂模式

进修python有一段时候,之前就是看看书,最后发明只有实践才干真正学到器材,只有在解决题目中才干真正把握。之前大牛也有效python实现各类设计模式的,我本身参考之前在学惯用C#实现设计模式的经验,也想把23种模式一一实践,从网上查了一些材料,才熟悉打听python固然是面向对象的,然则和C#,java说话不太一样。影响设计办法不一样有以下几点:1.python没有接口Interface的类型。...

weixin_39662142的博客 116

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

抽象工厂设计模式是什么?什么是 Abstract Factory 抽象工厂设计模式?Python 抽象工厂设计模式示例代码

抽象工厂设计模式是一种创建型设计模式,旨在提供一个创建一系列相关或相互依赖对象的接口,而无需指定其具体类。它允许客户端使用抽象的接口创建一组相关对象,而无需关注实际的对象实现。

天河书阁 - VicRestart 857

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

设计模式中的抽象工厂模式(Abstract Factory Pattern)

在软件开发中,经常需要创建一组相关的对象,并希望这些对象能够在不同的产品族之间互相兼容。如果直接在代码中实例化具体类,会导致代码耦合、难以扩展、违反开闭原则(OCP)。抽象工厂模式(Abstract Factory Pattern)提供了一种创建一组相关或依赖对象的接口,而无需指定它们的具体类,从而提高代码的灵活性和可维护性。本文将详细介绍抽象工厂模式的概念、应用场景,并通过 Python 代码示例展示其实现方式。

1106

设计模式篇之 抽象工厂Abstract Factory

摘要:抽象工厂是一种创建型设计模式,用于在不指定具体类的情况下创建一系列相关对象。它通过定义抽象产品接口(如Chair、Sofa)和抽象工厂接口(如createChair、createSofa)来确保同一产品族(如现代风格)的对象相互兼容。具体工厂(如ModernFactory)实现这些接口,生产匹配的具体产品。该模式解耦了客户端代码与具体产品类,支持产品变体的灵活切换,但会引入较多接口和类。适用于需要处理多个相关产品族且不希望依赖具体类的场景。

墨鱼第二大脑 200

python设计模式

学习python有一段时间,之前就是看看书,最后发现只有实践才能真正学到东西,只有在解决问题中才能真正掌握。之前大牛也有用python实现各种设计模式的,我自己参考之前在学习用java实现设计模式的经历,也想把23种模式逐一实践,从网上查了一些资料,才明白python虽然是面向对象的,但是和java语言不太一样。影响设计方法不一样有以下几点:  1.python没有接口Interface的类型。 ...

edward_2017的博客 488

常用设计模式Python实现

设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 代码查看:https://github.com/nonpricklycactus/Design-Pattern 一、设计模式分类 经典的《设计模式》一书归纳出23种设计模式,这23种模式又可...

nonpricklycactus的博客 6732

tcimport.php,Python设计模式

这两天在PythonTip刷题,突然看到这里提供了Python的设计模式demo,正是我多年来想找的东西。PythonTipPython设计模式于是乎,我就动用了我的爬爬爬爬爬虫把这些代码都爬下来了,放到简书,有时间就过来看看。25种设计模式,还是挺多的。borgclass Borg:__shared_state = {}def __init__(self):self.__dict__ = sel...

weixin_34691461的博客 207

python: Abstract Factory Pattern

摘要:本文通过珠宝行业的抽象工厂模式实现,展示了卡地亚和蒂芙尼两大珠宝品牌的生产线差异。系统定义了珠宝基类(Jewelry)和具体产品类(戒指Ring、项链Necklace、耳环Earrings),包含材质、重量等通用属性。抽象工厂(JewelryAbstractFactory)规范了生产接口,具体工厂(CartierFactory/TiffanyFactory)实现了各品牌特有的材质选择(如卡地亚18K金、蒂芙尼铂金)、成本计算和质检标准。业务流程(jewelry_business_process)封装了

Geovin Du Dream Park 320

abstract_factory

#!/usr/bin/python # -*- coding: UTF-8 -*- # vim:set shiftwidth=2 tabstop=2 expandtab textwidth=79: import random class PetShop(object): def __init__(self, animal_factory=None): self.pet_factor

snrnjhna的博客 465

测试代码设计模式:Helper、Builder与Factory在自动化测试中的实践应用

在软件工程中,设计模式是解决常见问题的可复用方案,它们能提升代码的可维护性、可读性和扩展性。其核心原理在于通过封装变化、分离关注点来降低系统复杂度。在自动化测试领域,测试代码同样面临重复、臃肿和难以维护的挑战。借鉴软件开发中的经典模式,可以显著提升测试代码的质量与工程效率。Helper模式专注于封装重复操作与复杂逻辑,实现高内聚的工具方法;Builder模式通过链式调用优雅地构造复杂测试数据,提升可读性;Factory模式则管理对象的创建生命周期,尤其适用于需要持久化或条件化创建的测试场景。这些模式共同解决

weixin_34387468的博客 411
上一篇: google官方android ndk demo解析(一)——audio echo
下一篇: Android引导页播放视频——使用VideoView
hunter800421
博客等级 码龄22年 60粉丝 97原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值