加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

Python设计模式:工厂模式

发布时间:2020-12-20 10:06:28 所属栏目:Python 来源:网络整理
导读:工厂模式: “工厂”即表示一个负责创建其他类型的对象的类,通常情况下,一个工厂的对象会有一个或多个方法与之关联,这些方法用于创建不同类型的对象,工厂对象会根据客户端给方法传递的不同的参数或者客户端调用不同的方法返回不同的对象。 优点: 对象的

工厂模式:“工厂”即表示一个负责创建其他类型的对象的类,通常情况下,一个工厂的对象会有一个或多个方法与之关联,这些方法用于创建不同类型的对象,工厂对象会根据客户端给方法传递的不同的参数或者客户端调用不同的方法返回不同的对象。

优点:对象的创建是可以根据需要单独创建的,但是使用工厂模式来创建对象有以下优点:

  • 松耦合,对象的创建是根据工厂类来进行的,与类本身的实现是独立开来的。
  • 对于客户端来说,不需要知道类的具体实现,只需要调用相应接口就可以得到需要的对象了,这其实是简化了客户端的相关实现。
  • 对于对象的修改只需要在工厂里面进行即可,包括添加新的对象,客户端只需要更改少量的代码,甚至可以不修改代码就可以达到要求。
  • 使用工厂接口,还可以重用已有的对象,不用去别处调用已有的对象或者重新创建一个对象。

工厂模式的3种实现形式(或者说3中变体):

  • 简单工厂模式:工厂类会提供一个接口,并根据客户端传入参数来创建相应的实例对象。(创建一个对象)
  • 工厂方法模式:需要定义一个基类,不同的子类则代表着不同类型的对象。相对于简单工厂模式而言,工厂方法模式具有更强的可定制性。(创建一个对象)
  • 抽象工厂模式:需要定义一个抽象工厂类,然后由不同的子类来创建不同系列的对象,一个系列即代表一组对象。(创建一组对象)

简单工厂模式示例:

from abc import ABCMeta,abstractmethod


class Flower(metaclass=ABCMeta):
    @abstractmethod
    def show_price(self):
        pass


class Rose(Flower):
    print('Rose price: $99')


 Tulip(Flower):
    Tulip price: $66 FlowerSimpleFactory:
     get_flower(self,flower_type):
        return eval(flower_type)()


if __name__ == __main__:
    flower_factory = FlowerSimpleFactory()
    rose = flower_factory.get_flower(Rose)
    tulip = flower_factory.get_flower(Tulip)
    rose.show_price()
    tulip.show_price()
Rose price: $99
Tulip price: $66

特点:接口根据客户端传入的参数即可返回对应的实例对象,甚至不用返回它的对象就可以进行对应的操作(比如示例中的工厂FlowerSimpleFactory中可以直接定义一个print_price方法来打印各种花的价格,而不是先返回对象,再由对象调用show_price方法来打印),即不会暴露对象的创建逻辑,客户端直接使用接口即可完成对象的创建,甚至创建对象之后的一些操作。

?

工厂方法模式示例:

 Lily(Flower):
    Lily price: $33class FlowerShopFactory(metaclass=ABCMeta):
    def __init__(self):
        self.flowers = []
        self.stock_flowers()

    @abstractmethod
     stock_flowers(self):
        pass

     get_flowers(self):
         self.flowers

     add_flower(self,flower):
        self.flowers.append(flower)


 FlowerShop1(FlowerShopFactory):
     stock_flowers(self):
        self.add_flower(Rose())
        self.add_flower(Tulip())


 FlowerShop2(FlowerShopFactory):
    
        self.add_flower(Rose())
        self.add_flower(Tulip())
        self.add_flower(Lily())


:
    flower_shop1 = FlowerShop1()
    for flower in flower_shop1.get_flowers():
        flower.show_price()

    flower_shop2 = FlowerShop2()
     flower_shop2.get_flowers():
        flower.show_price()
Rose price: $99
Tulip price: $66
Rose price: $99
Tulip price: $66
Lily price: $33

特点:工厂方法可以根据基类来定义不同的子类,如示例中的FlowerShop1和FlowerShop2,每个子类则代表“工厂”可以创建的一个“产品”。即对象的创建是通过继承的子类来完成的。

?

抽象工厂模式示例:

class MiniCar(metaclass= show_size(self):
        class SedanCar(metaclass=# 国产车
 DomesticMiniCar(MiniCar):
    Domestic mini car size: 111 DomesticSedanCar(SedanCar):
    Domestic sedan car price: 10W 英国车
 EnglishMiniCar(MiniCar):
    English mini car size: 222)
        

 EnglishSedanCar(SedanCar):
    English sedan car price: 30w 抽象工厂类
class CarFactory(metaclass= create_mini_car(self):
        pass

    @abstractmethod
     create_sedan_car(self):
         国产车工厂类
 DomesticCarFactory(CarFactory):
     DomesticMiniCar()
    
     DomesticSedanCar()


 EnglishCarFactory(CarFactory):
     EnglishMiniCar()
    
    return EnglishSedanCar()

?

特点:需要定义一个接口(如示例的抽象工厂类)来创建一系列的相关对象,如示例中的两个子类分别创建两个系列的对象(国产车和英国车),即对象的创建也是由子类来完成。

?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读