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() ? 特点:需要定义一个接口(如示例的抽象工厂类)来创建一系列的相关对象,如示例中的两个子类分别创建两个系列的对象(国产车和英国车),即对象的创建也是由子类来完成。 ? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |