python抽象工厂模式_通俗 Python 设计模式——工厂模式

今天讲一下最简单常用的创建型模式——工厂模式。

工厂模式,从名字上来讲就已经说明了它的本质——像工厂一样,根据得到的材料构造需要的产品。但是根据书上的介绍工厂模式通常有两种形式:一种工厂方法,一种是抽象工厂。我们分别来讲述一下工厂模式的这两种形式。

通俗的解释工厂方法就是是:给出固定的接口,根据你的输入,会得到与输入相对应的输出。也许这个说法还是不够通俗,那么我们来看一个例子。

在编写一个web框架时,我们需要考虑到用户可能会连接各种各样的数据库,但是我们不能预知用户会使用哪个数据库。于是我们提供一个通用方法,里面包含了各个数据库的连接方案,用户在使用过程中,只需要传入数据库的名字并给出连接所需要的信息,即可得到一个固定的 | 针对用户所选数据库的 | 连接字符串。

如果还是不明白,那我们来看看代码好了:

def connect(db, *arg, **kwargs):

db = db.lower()

dbname = kwargs['db']

if db == 'mysql':

result = "mysql://{username}:{password}@{server}/{dbname}".format(username = kwargs['username'], password = kwargs['password'], server = kwargs['server'], dbname=dbname)

elif db == 'sqlite':

result = 'sqlite:///{server}{dbname}.sqlite'.format(server = kwargs['server'], dbname=dbname)

return result

如果用户的输入为 'MySQL', 那么工厂方法会为其返回一个用于连接 MySQL 数据库的连接字符串;如果用户的输入为 'SQLite',那么将会得到一个用于连接 SQLite 数据库的连接字符串;更多的则是同样的原理。

所以现在大家看到了,其实这个方法非常初级非常暴力,就是无限的罗列需要考虑的情况并给出对应的处理而已。

现在我们来讲讲抽象工厂。故名思议,它表示针对工厂方法进一步抽象化,用于工厂方法本身也需要抽象集中管理的情况。比如说书上的这个例子:

你在编写一款面向全年龄的游戏,游戏本身需要使用工厂方法进行开发。但游戏也需要考虑不同年龄段玩家的需求和口味不同,所以需要为不同年龄段的玩家针对游戏进行一定的修改。于是在用户输入年龄后,运行符合其年龄的要求的游戏。

这种情况下,我们创建游戏内容的过程,可以使用工厂方法统一管理,但是针对创建符合哪个年龄段的游戏内容,我们则需要进一步抽象出来管理,这种情况就是所谓的抽象工厂。

不过Python中的抽象工厂与其他静态语言的抽象工厂有一个小小的区别。得益于Python的灵活性,其类型实在运行中确定,即避免了其他静态语言中必须要创建抽象类或接口的复杂动作。具体代码较长,这里就不贴了,有兴趣的朋友可以直接阅读原书代码部分。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值