python中抽象工厂的基础

afb的Python项目详细描述


抽象工厂代理

简介

抽象工厂代理(afb)是一个方便抽象工厂管理的库。它引入了一种通过抽象工厂网络将配置文件转换为python对象的机制,允许灵活地指定执行行为。

安装

此库支持Python3.3+。

$ pip install afb

机制

此软件包包含两个类:

  • 制造商
    • 同类工厂集合。
  • 经纪人:
    • 制造商集合

制造商

制造商是一类工厂的集合。它负责将对象创建请求委托给指定的工厂。过程如下:

  1. 根据给定的密钥检索工厂以及其他信息。
  2. 根据工厂的签名准备工厂所需的参数。
  3. 调用工厂并返回结果。

每个请求都是通过调用带有参数的方法来完成的

  • 方法:工厂的钥匙。
  • params:关键字参数值的adict

工厂依赖于文本中不可直接表示的对象(如字符串或数字)的情况并不少见。在这种情况下,对所需对象的请求可以嵌套在当前请求中。manufacturer首先通过broker建立的网络将子请求传递给所需类的manufacturer来准备参数(参见下文)。之后,调用工厂以返回所需的结果。

经纪人

代理(broker)是制造商(manufacturer)的集合,它定义了一个制造商(manufacturer)网络(manufacturer)。它包含一个类到制造商的映射,将请求传递给负责的制造商进行处理。

它还通过其make方法接受对象创建请求,在该方法中,需要额外的cls参数来确定要使用的正确manufacturer

让我们看一个例子。假设有两个类,aba有一个工厂fa依赖于ab对象和一个float

deffa(b,x):"""Creates an `A` object.  Args:    b: An instance of `B` object.    x: A float.  """...returnA(...)

并且b有一个工厂fb这取决于一个字符串:

deffb(s):"""Creates a `B` object.  Args:    s: String.  """...returnB(...)

通过首先创建一个b对象,可以创建a的实例,并使用float将其传递给fa

# Create a `B` objects="some string"b=fb(s)# Create an `A` objectx=3.14a=fa(b,x)

假设上述工厂在由代理定义的网络中注册到各自的制造商中(MFR AMFR B),A可以通过以下调用创建:

params={"fa":{"b":{"fb":{"s":"some string"}},"x":3.14}}a=bkr.make(cls=A,params=params)

这允许我们将对象规范导出到执行时(甚至动态生成)提供的外部配置文件中,使程序具有显著的可配置性。


基本用法

最好用一个例子来说明它是如何工作的。假设我们有以下课程:

# Class definitionsclassA(object):...classB(object):...classC(object):...

每个班级都有一个工厂,比如:

# Factoriesdeffa(x:int,y:float)->A:returnA(...)deffb(z:str,a:A)->B:returnB(...)deffc(x:float,b:B)->C:returnC(...)

注意:这里我们使用Python3.5提供的类型提示进行简单说明。在实际代码中,它们不是必需的。

现在我们有三个班,每个班有一个工厂。我们需要做的第一件事是为每个类创建一个制造商,并注册它们的工厂。

# Manufacturer for class B# ---------------------------# 1.1 Create Manufacturermfr_b=Manufacturer(B)# 1.2 Register `fb` into `mfr_b`# 1.2.1 Provide descriptions for `fa`.descriptions={"short":"Creates B from z, a.""long":"""Creates B from z, a, where ..."""}# 1.2.2 Provide signature, with descriptionssig_b={"z":{"type":str,"description":"Input mode of ..."},"a":{"type":A,"description":"Logic block A which ..."}}# 1.2.3 Register factory.# We use the key "fact_b" to refer to the factory `fb`mfr_a.register("fact_b",fb,sig_b,descriptions=descriptions)

最后,将所有制造商注册到代理颂歌>:< /P>

# Create a Brokerbroker=Broker()# Register Manufacturersbroker.register(mfr_a)broker.register(mfr_b)broker.register(mfr_c)# Or one can make a single function call:#   `broker.register_all([mfr_a, mfr_b, mfr_c])

从这一点出发,可以使用broker和注册的manufacturers来创建对象。例如,可以通过以下方式创建a的实例:

$ pip install afb
0

broker.make方法接受两个参数:

  1. 目标类
  2. 对象规范

目标类(cls)用于broker检索右边的manufacturer,而对象speicifcation是指定:

  1. 用作钥匙的工厂
  2. 作为值传递到工厂的参数

对象规范可以嵌套。考虑创建一个对象c,它在fc中使用fb表示所需的b,在fb中使用fa表示所需的a

$ pip install afb
1

执行过程如下:

  1. broker检索c制造商,并调用mfr\u c.make
  2. mfr_c检索由"fact_c"fc键入的工厂,并为其准备参数xb
  3. 由于fc需要x作为float,并且给定的值本身就是float,所以它将进入下一个参数。
  4. fc要求b作为ab,并且给定值是单变量dict规范b,它被解释为对象规范。mfr\u c然后生成一个broker.make调用对象实例化。
  5. 代理检索b制造商制造商b,并用规范b调用制造商b.make
  6. mfr_b检索由"fact_b"fb键入的工厂,并为其准备参数za
  7. 由于fb需要z作为str,且给定值本身是astr,因此它将进入下一个参数。
  8. fb要求将a作为a,并且给定的值是单例的dict规范a,它被解释为对象规范。mfr_b然后生成一个broker.make调用对象实例化。
  9. broker检索amanufacturermfr_a,并用spec_a调用mfr_a.make
  10. mfr_a检索由"fact_a"fa键入的工厂,并为其准备参数xy
  11. 由于fa需要x作为int,并且给定的值本身就是int,所以它进入下一个参数。
  12. fa要求y作为浮点值,并且给定值本身是浮点值,为fa进行参数准备
  13. mfr a用准备好的xy调用fa,并将结果obj afa返回给调用方。
  14. 代理对象a返回给调用方。
  15. 制造商b完成参数准备。它用准备好的za调用fb,并将结果返回给调用方。
  16. 代理对象b返回给调用方。
  17. mfr_c完成参数准备。它用准备好的xb调用fc,并将结果返回给调用方。
  18. 代理对象c返回给调用方。

注意:以上是仅供说明之用。在实际应用中,规范通常是从配置文件中加载的,类和工厂是在专用的包和模块中定义的,并有一个用于管理的注册表。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何在MySql中创建类似序列的东西   intellij idea Java错误在命令窗口中运行简单程序时发生JNI错误   使用JavaBrains中的代码时出现java异常   java如何调用父重写方法   java JavaFx:使用加法/乘法双向绑定数字/   java如何使用文件以特定的方式打印目录树。newDirectoryStream和递归?   java图形未显示在JFrame上   扫描仪上的java NoTouchElementException。下一行()   java中jenkins中显示的api访问Fitnesse结果   JavaGMF以编程方式创建连接,而不使用命令   java什么从unity3d发送json   在Java中模仿PHP http_build_查询函数   安卓中的java转储内存   在java中解析如何从字符串中读取第二行   java OutputLength Rijndael实现中的异常   Java右移输出负值   java多选项,选择最佳?   JavaSwingGUI在Java1.8更新后不刷新或冻结   java使用jpa查询将datetime字段与日期进行比较