工厂简单模式模拟
代码:
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:
"""咖啡机"""
@staticmethod
def make_coffee(coffeeBean):
if coffeeBean == '拿铁咖啡豆':
coffee = LatteCoffee('拿铁咖啡')
elif coffeeBean == '摩卡咖啡豆':
coffee = MochaCoffee('摩卡咖啡')
else:
return None
return coffee
if __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 Enum
class PenType(Enum):
"""画笔类型"""
PenTypeLine = 1
PenTypeRect = 2
PenTypeEllipse = 3
class Pen:
"""画笔"""
def __init__(self, name):
self.__name = name
def get_type(self):
pass
def get_name(self):
return self.__name
class LinePen(Pen):
def __init__(self, name):
super().__init__(name)
def get_type(self):
return PenType.PenTypeLine
class RectPen(Pen):
def __init__(self, name):
super().__init__(name)
def get_type(self):
return PenType.PenTypeRect
class EllipsePen(Pen):
def __init__(self, name):
super().__init__(name)
def get_type(self):
return PenType.PenTypeEllipse
class 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] = pen
return pen
else:
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()))