设计一个矩形类rectangle_设计模式Python版系列介绍:3、抽象工厂模式

6478d3c8a04ca346b203e50080f52841.png

抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。

缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。

使用场景: 1、QQ 换皮肤,一整套一起换。 2、生成不同操作系统的程序。

UML类图

抽象工厂在是工厂模式的基础上,有增加了对工厂的抽象。

a4f2718aa158f525c52a6e966ba93c0f.png

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我的颜色是:红色我的颜色是:蓝色我的颜色是:黑色

工厂类与抽象工厂类的区别

66ce6f2782aaa6e025004ffa319a874f.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值