抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。
使用场景: 1、QQ 换皮肤,一整套一起换。 2、生成不同操作系统的程序。
UML类图
抽象工厂在是工厂模式的基础上,有增加了对工厂的抽象。
Python代码实现
形状类的实现:
# -*- coding:utf-8 -*-import math# 1 先定义形状类这个系列# 定义一个“形状”的接口,里面定义一个面积的接口方法,只有方法的定义,并没有实现体class IShape(object): def Area(self): pass# 定义4个图形类,都是实现Ishape接口,并且每一个图形都有一个可以计算面积的方法,相当于重写接口方法class Circle(IShape): def Area(self, radius): return math.pow(radius, 2) * math.piclass Rectangle(IShape): def Area(self, longth, width): return 2 * longth * widthclass Triangle(IShape): def Area(self, baselong, height): return baselong * height / 2class Ellipse(IShape): def Area(self, long_a, short_b): return long_a * short_b * math.pi
颜色类的实现:
# 2 再定义颜色类这个系列# 定义一个“颜色”的接口,里面定义一个颜色名称的接口方法,只有方法的定义,并没有实现体class IColor(object): def color(self): pass# 定义3个颜色类,都是实现IColor接口,并且每一个图形都有一个可以获取颜色名称的方法,相当于重写接口方法class Red(IColor): def color(self, name): print(f'我的颜色是:{name}')class Blue(IColor): def color(self, name): print(f'我的颜色是:{name}')class Black(IColor): def color(self, name): print(f'我的颜色是:{name}')
工厂类的实现:
# 3 定义抽象工厂以及与每一个系列对应的工厂class IFactory: # 模拟接口 def create_shape(self): # 定义接口的方法,只提供方法的声明,不提供方法的具体实现 pass def create_color(self): pass# 创建形状这一个系列的工厂class ShapeFactory(IFactory): # 模拟类型实现某一个接口,实际上是类的继承 def create_shape(self, name): # 重写接口中的方法 if name == 'Circle': return Circle() elif name == 'Rectangle': return Rectangle() elif name == 'Triangle': return Triangle() elif name == 'Ellipse': return Ellipse() else: return None# 创建颜色这一个系列的工厂class ColorFactory(IFactory): # 模拟类型实现某一个接口,实际上是类的继承 def create_color(self, name): # 重写接口中的方法 if name == 'Red': return Red() elif name == 'Blue': return Blue() elif name == 'Black': return Black() else: return None# 4 定义产生工厂类的类——抽象工厂模式的核心所在# 定义一个专门产生工厂的类class FactoryProducer: def get_factory(self,name): if name=='Shape': return ShapeFactory() elif name=='Color': return ColorFactory() else: return None
测试
if __name__ == '__main__': factory_producer = FactoryProducer() shape_factory = factory_producer.get_factory('Shape') color_factory = factory_producer.get_factory('Color') # -------------------------------------------------------------- circle = shape_factory.create_shape('Circle') circle_area = circle.Area(2) print(f'这是一个圆,它的面积是:{circle_area}') rectangle = shape_factory.create_shape('Rectangle') rectangle_area = rectangle.Area(2, 3) print(f'这是一个长方形,它的面积是:{rectangle_area}') triangle = shape_factory.create_shape('Triangle') triangle_area = triangle.Area(2, 3) print(f'这是一个三角形,它的面积是:{triangle_area}') ellipse = shape_factory.create_shape('Ellipse') ellipse_area = ellipse.Area(3, 2) print(f'这是一个椭圆,它的面积是:{ellipse_area}') # --------------------------------------------------------------- red = color_factory.create_color('Red') red.color('红色') blue = color_factory.create_color('Blue') blue.color('蓝色') black = color_factory.create_color('Black') black.color('黑色')
运行结果:
这是一个圆,它的面积是:12.566370614359172这是一个长方形,它的面积是:12这是一个三角形,它的面积是:3.0这是一个椭圆,它的面积是:18.84955592153876我的颜色是:红色我的颜色是:蓝色我的颜色是:黑色