设计模式之工厂方法模式
工厂方法模式简介
定义
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
简单工厂 VS 工厂方法
- 简单工厂:在工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。但是,当在工厂类中需要添加新的实例化对象类时,需要修改工厂类,这样就违背了“开-闭原则”。
- 工厂方法:工厂方法模式就是为了解决简单工厂模式中存在的问题。通过创建工厂类接口,将具体的实例化的功能,下放到子类去实现,这样,当需要添加新实例化对象类时,就无需去修改工厂类,只需依据工厂类接口,实现一个新的类即可。这也体现出来了“依赖倒转”原则。但是,这样做的缺点是,将必要的逻辑判断下放到了客户端程序中,不是一个好的选择。当然,这样的情况,我们可以通过“反射”来解决。
案例
题目
用任意一种面向对象语言实现一个计算器控制台程序。要求输入两个数和运算符号,得到结果。
代码实现
#!/usr/bin/env python # _*_ coding utf-8 _*_ #Author: aaron import abc class Operation(object): def __init__(self, NumberA=0, NumberB=0): self.NumberA = NumberA self.NumberB = NumberB def GetResult(self): pass class AddOp(Operation): def GetResult(self): return self.NumberB + self.NumberA class MinusOp(Operation): def GetResult(self): return self.NumberA - self.NumberB class MultiOp(Operation): def GetResult(self): return self.NumberA * self.NumberB class DivideOp(Operation): def GetResult(self): try: return 1.0 * self.NumberA / self.NumberB except ZeroDivisionError: raise class Factory(metaclass=abc.ABCMeta): @abc.abstractmethod def create_factory(self): '''工厂类抽象接口''' class AddFactory(Factory): def create_factory(self): return AddOp() class MinusFactory(Factory): def create_factory(self): return MinusOp() class MultiFactory(Factory): def create_factory(self): return MultiOp() class DivideFactory(Factory): def create_factory(self): return DivideOp() if __name__ == '__main__': ch = '' while not ch == 'q': NumberA = eval(input('Please input number1: ')) op = str(input('Please input the operation: ')) NumberB = eval(input('Please input number2: ')) if op == '+': OPFactory = AddFactory() elif op == '-': OPFactory = MinusFactory() elif op == '*': OPFactory = MultiFactory() elif op == '/': OPFactory = DivideFactory() else: print('invilid input!') oper = OPFactory.create_factory() oper.NumberA = NumberA oper.NumberB = NumberB print('The result is:', oper.GetResult()) print('\n#-- input q to exit any key to continue') try: ch = str(input()) except: ch = ''
版权声明:本文为cjaaron原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。