工厂简单模式模拟
代码:
class LatteCoffee(Coffee):"""拿铁咖啡"""def __init__(self, name):super().__init__(name)def get_taste(self):return '拿铁咖啡'class MochaCoffee(Coffee):"""摩卡咖啡"""def __init__(self, name):super().__init__(name)def get_taste(self):return '摩卡咖啡'class CoffeeMaker:"""咖啡机"""@staticmethoddef make_coffee(coffeeBean):if coffeeBean == '拿铁咖啡豆':coffee = LatteCoffee('拿铁咖啡')elif coffeeBean == '摩卡咖啡豆':coffee = MochaCoffee('摩卡咖啡')else:return Nonereturn coffeeif __name__ == '__main__':latte = CoffeeMaker.make_coffee('拿铁咖啡豆')print(latte.get_name(), '制作', latte.get_taste())mocha = CoffeeMaker.make_coffee('摩卡咖啡豆')print(mocha.get_name(), '制作', mocha.get_taste())
什么是简单工厂模式
专门定义一个类来负责创建其他类的实例,根据传入的参数的不同创建不同类的实例,被创建的实例通常具有一个共同的父类,这个模式叫简单工程模式。
简单工厂模式又称静态工厂方法模式。之所以叫“静态”,是因为在很多静态语言中方法通常被定义成一个静态方法,这样可以通过类名来直接调用方法。
工厂模式的设计思想
我们拿咖啡机制作咖啡,加入不同风格的咖啡豆就产生不同口味的咖啡,这一过程就如同一个工厂,我们加入不同的配料,就会产生出不同的产品,这就是程序设计中的工厂模式的概念。
在工厂模式中,用来创建对象的类叫工厂类,被创建的对象的类叫产品类。
工厂模式三姐妹
工厂模式三姐妹:简单工厂模式、工厂方法模式、抽象工厂模式,这三种模式可以理解为同一种编程思想的三个版本,从简单到高级不断升级。
简单工厂模式
定义
优缺点
优点
实现简单、结构清晰。
抽象出一个专门的类来负责某个类对象的创建,分割出创建的职责,不能直接创建具体的对象,只需要传入适当的参数即可。
使用者可以不关注具体对象的类名,只需要知道传入什么参数可以创建哪些需要的对象。
缺点
不易拓展、一旦添加新的产品类,就不得修改工厂的创建逻辑。不符合“开放-封闭”原则,如果要增加或者删除一个产品类,就要修改 if else 的判断代码。
当产品类型较多时,工厂的创建逻辑可能过于复杂,if else 判断会变的非常多。一旦出错所有产品的创建失败,不利于系统的维护。
应用场景
产品具有明显的继承关系,且产品的类型不太多。
所有的产品具有相同的方法和类似的属性,使用者不关系具体的类型,只希望传入合适的参数能返回合适的对象。
尽管简单工厂模式不符合“开放-封闭”原则,但因为它简单,所以依然能在很多项目中用
实战应用
代码:
from enum import Enumclass PenType(Enum):"""画笔类型"""PenTypeLine = 1PenTypeRect = 2PenTypeEllipse = 3class Pen:"""画笔"""def __init__(self, name):self.__name = namedef get_type(self):passdef get_name(self):return self.__nameclass LinePen(Pen):def __init__(self, name):super().__init__(name)def get_type(self):return PenType.PenTypeLineclass RectPen(Pen):def __init__(self, name):super().__init__(name)def get_type(self):return PenType.PenTypeRectclass EllipsePen(Pen):def __init__(self, name):super().__init__(name)def get_type(self):return PenType.PenTypeEllipseclass PenFactory:"""画笔工厂类"""def __init__(self):self.__pens = {}def get_single_obj(self, pen_type, name):"""获得一个实例对象"""def create_pen(self, pen_type):if self.__pens.get(pen_type) is None:if pen_type == PenType.PenTypeLine:pen = LinePen('直线画笔')elif pen_type == PenType.PenTypeRect:pen = RectPen('距形画笔')elif pen_type == PenType.PenTypeEllipse:pen = EllipsePen('椭圆画笔')else:pen = Pen('')self.__pens[pen_type] = penreturn penelse:return self.__pens[pen_type]if __name__ == '__main__':factory = PenFactory()line = factory.create_pen(PenType.PenTypeLine)print('创建了%s 对象ID:%s 类型:%s' % (line.get_name(), id(line), line.get_type()))rect = factory.create_pen(PenType.PenTypeRect)print('创建了%s 对象ID:%s 类型:%s' % (rect.get_name(), id(rect), rect.get_type()))rect2 = factory.create_pen(PenType.PenTypeRect)print('创建了%s 对象ID:%s 类型:%s' % (rect2.get_name(), id(rect2), rect2.get_type()))ellipse = factory.create_pen(PenType.PenTypeEllipse)print('创建了%s 对象ID:%s 类型:%s' % (ellipse.get_name(), id(ellipse), ellipse.get_type()))
