pyhon面向对象设计之抽象工厂模式

简介

抽象工厂设计模式属于创建型设计模式的一种,创建型设计模式更关注对象是如何被创建出来的。通常我们会调用对象的构造函数来创建对象实例,比如通过向类名称传递相关参数来创建。但是,有时候我们会需要更加灵活的对象创建方式,这时创建型的设计模式就会大有用处了。今天我们主要关注创建型的设计模式中的抽象工厂设计模式。抽象工厂设计模式主要用于对于某一个系统而言,根据配置文件的不同或者系统平台(windows/mac/linux)的不同有多种不同的实现方式的时候。
比如:在一个GUI系统里,我们可能有一个抽象的窗口小部件工厂,而这个工厂有三个具体实现子类工厂:MacWidgetFactory, xfceWidgetFactory和WindowsWidgetFactory, 所有的这些子类工厂中都提供了创建相同窗口小部件的方法,比如类似于make_button(), make_spinbox()等等,这些方法则根据不同的平台提供了不同的具体实现。这样,我们就可以通过向同一个函数create_dialog()传递不同的工厂实例,从而产生出平台相关的不同的窗口的外观样式,比如:windows样式的、mac样式的。
一个典型的抽象工厂
为了演示抽象工厂设计模式,我们来看一个产生简单图表的程序。在这个程序里我们设计了两个不同的工厂:一个产生纯文本方式的图表,二另外一个输出可缩放的矢量图形式。输出图形如图1所示。

图1 程序输出结果
首先看一下main()函数:

textFilename与svgFilename是两个文件,用来存储diagram的相关信息,我们调用了相同的create_diagram函数,并传递了不同的工厂实例,从而返回了不同的结果。依据不同的配置文件返回了不同的处理结果,这是典型的抽象工厂模式。我们来更进一步查看create_diagram是如何定义的。

这个函数接受一个factory作为它唯一的参数,并根据factory的不同创建不同的图表。这个函数并不知道或者根本不关心它所接收的到底是哪一类工厂,只要它支持图表工厂的接口即可。下面我们来看下这两个不同的工厂是如何定义的。

上述是纯文本格式图表工厂的定义,实际上它也是基类工厂,svgDiagramFactory是派生自这个工厂的。尽管这种设计模式采用了“抽象”这个词语,在实际实现过程中,比较常见的做法是将某个类既作为基类提供相应的接口,同时它本身又是一个具体的子类。本例中的DiagramFactory即是这样使用的。

上面是svg图表工厂的几行代码,与纯文本格式图表工厂的make_diagram()方法唯一的不同在于纯文本格式图表工厂的make_diagram()方法返回了一个Diagram对象。而svgDiagramFactory的make_diagram()方法返回了一个SvgDiagram对象。make_rectange和make_text()方法与之类似。
纯文本格式的图表工厂用一个由一系列单字符列表组成的列表来存储相应的信息,这些单字符从图1中就可以看出来包括了空格、+、-、|、%等等。程序会在初始化的时候,将由width和height参数指定的宽和高覆盖的区域,初始化成一系列空格覆盖的区域。当调用add方法的时候,就会将rectangle及text指定的位置替换成上述的单字符及本身包含的字符内容。

这个是Text类的所有代码,对于纯文本格式的图表工厂最后一个fontsize参数可以忽略。可以看到,Text类中保存了一个rows的列表,该列表的每个元素也是一个列表,其元素为text中的每个字符。

这是Diagram的add方法,它接收一个component(即Text或者Rectangle)为参数,而后遍历component中保存的rows参数,并将diagram中的相应位置替换成相应的字符串。

这个是SvgText的类代码,以及它所以来的两个常量的定义。使用 **locals()这种定义方法,可以简化代码,而无需写成如下的格式SVG_TEXT.format(x=x,y=y,text=text,fontsize=fontsize)。而从Python3.2开始,可以使用SVG_TEXT.format_map(locals())代替,因为str.format_map()帮助我们进行了参量的解压缩。对于SvgDiagram类而言,每个实例里存储着一个字符串列表self.digram,列表里的每个元素都是一段html代码。这样就使得添加新的SvgRectangle和SvgText等类型的组件非常方便。
上述代码虽然以抽象工厂模式的代码实现了相应的功能,但代码不够简洁,不够pythonic,所以第二篇文章,我们希望能够通过相应的改进,能够让代码更加简洁并且pythonic化,敬请期待!
好了,这个是我们面向对象程序设计里的抽象工厂方法的第一篇文章,喜欢的话给个赞吧,谢谢!

原文地址:http://blog.51cto.com/13466841/2127217

时间: 2024-10-09 17:12:55

pyhon面向对象设计之抽象工厂模式的相关文章

C#面向对象设计之——抽象工厂模式(四)

一.前言 工厂方法模式是为了克服简单工厂模式的缺点而设计出来的,简单工厂模式的工厂类随着产品类的增加需要增加额外的代码),而工厂方法模式每个具体工厂类只完成单个实例的创建,所以它具有很好的可扩展性.但是在现实生活中,一个工厂只创建单个产品这样的例子很少,因为现在的工厂都多元化了,一个工厂创建一系列的产品,如果我们要设计这样的系统时,工厂方法模式显然在这里不适用,然后抽象工厂模式却可以很好地解决一系列产品创建的问题. 抽象工厂模式提供创建一系列相关或者相互依赖对象的接口. 二.结构图 三.实例代码

C#面向对象设计之——简单工厂模式(二)

一.前言 简单工厂是一个负责生产对象的中间类,例如有加减乘除四个运算方法,它们继承父类,并重写父类的方法,简单工厂根据不同的运算符创建不同的实例对象赋值给父类,实现了面向对象的另一个原则——降低对象之间的耦合度.简单工厂模式解决了客户端直接依赖于具体对象的问题,客户端可以消除直接创建对象的责任,而仅仅是消费产品.简单工厂模式实现了对责任的分割. 简单工厂模式的缺点: 工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都会受到影响 系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,这样就会造

Python面向对象程序设计之抽象工厂模式之二-一个更加pythonic的抽象工厂

上一篇文章我们说到DiagramFactory和其SvgDiagramFactory子类以及它们使用到的类比如(Diagram,SvgDiagram等等),能够很好的实现预订的功能并且也符合抽象工厂的设计模式. 然而,我们的实现并非是非常完美的,至少还有以下几点不足: 1)我们并不需要保存每个工厂的状态,因此,在向create_diagram传递参数的时候,就没有必要传递工厂的实例. 2)SvgDiagramFactory的代码几乎和DiagramFactory完全一样,唯一的区别就在于其返回值

Java设计模式——抽象工厂模式(Abstract factory)

抽象工厂模式可以向客户提供接口,使得客户端在不必指定产品具体类型的情况下创建多个产品族中的产品对象. 系统的设计 采用抽象工厂模式设计出的系统类图如下: 从上图可以看出,抽象工厂模式涉及到角色: 抽象工厂角色(AbstractFactory):担任这个角色的是工厂方法模式的核心,它与应用系统的商业逻辑无关.通常使用Java接口或者抽象Java类实现,而所有的具体工厂类都必须实现这个Java接口或者继承这个抽象Java类. 具体工厂类(ConcreteFactory)角色:这个角色直接在客户端的调

抽象工厂模式的应用

一.实验目的: 1) 掌握抽象工厂模式(Abstract Factory)的特点 2) 分析具体问题,使用抽象工厂模式进行设计. 二.实验环境: Eclipse       三.实验内容: (写出主要的内容) 麦当劳(McDonalds)和肯德基(KFC)快餐店都经营汉堡(Hamburg)和可乐(Cole),用JAVA语言实现(C#控制台应用程序实现)这两个快餐店经营产品的抽象工厂模式.绘制该模式的UML图. [模式UML图] [模式代码] 购物接口以及具体实现类型 public interfa

模式设计-----抽象工厂模式

抽象工厂模式(Abstract Factory)属于创建型工厂模式的一种. 特点:客户仅与抽象类定义的接口交互,而不使用特定的具体类的接口. 这里是一个python的例子,运行环境是python 2.7 import random class PetShop:     """A pet shop"""     def __init__(self, animal_factory=None):         self.pet_factory = a

iOS设计模式——工厂方法(简单工厂模式,工厂方法模式, 抽象工厂模式)

1. 简单工厂模式 如何理解简单工厂,工厂方法, 抽象工厂三种设计模式? 简单工厂的生活场景,卖早点的小摊贩,他给你提供包子,馒头,地沟油烙的煎饼等,小贩是一个工厂,它生产包子,馒头,地沟油烙的煎饼.该场景对应的UML图如下所示: 图1:简单工厂模式UML图 简单工厂模式的参与者: 工厂(Factory)角色:接受客户端的请求,通过请求负责创建相应的产品对象. 抽象产品(Abstract Product)角色: 是工厂模式所创建对象的父类或是共同拥有的接口.可是抽象类或接口. 具体产品(Conc

设计模式演练——抽象工厂模式

1.小C的故事 下面讲述的是关于x星系喵星和汪星两个宿敌星球之间的故事.首先把镜头聚焦到喵星,它是主角登场的地方.(本故事纯属虚构,如有雷同,纯属巧合)        喵星纪元9035年,汪星精锐舰队聚集在近喵星轨道,企图一举拿下喵星.大部分喵星人已经被转移到防空工事中.喵星国王下令出动最强战力迎击来敌.喵小c是战斗机编队到王牌飞行员,参加了上百场战斗,获得了很多荣誉,他是本次先头部队的一员.        “装载初级武器,装载初级防御罩,装载初级逃生仓.准备完毕,出发!”,航空港的扩音机发出急

设计模式之_简单工厂模式、工厂方法模式、抽象工厂模式 、策略模式、策略与工厂的区别(转)

一.前言 话说十年前,有一个爆发户,他家有三辆汽车(Benz(奔驰).Bmw(宝马).Audi(奥迪)),还雇了司机为他开车.不过,爆发户坐车时总是这样:上Benz车后跟司机说“开奔驰车!”,坐上Bmw后他说“开宝马车!”,坐上 Audi后他说“开奥迪车!”.你一定说:这人有病!直接说开车不就行了?!而当把这个爆发户的行为放到我们程序语言中来,我们发现C语言一直是通过这种方式来坐车的 幸运的是这种有病的现象在OO语言中可以避免了.下面以Java语言为基础来引入我们本文的主题:工厂模式! 二.简介