欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

设计模式之工厂方法模式

程序员文章站 2022-04-15 19:52:52
工厂方法模式简介 定义 定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。 简单工厂 VS 工厂方法 简单工厂:在工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。但是,当在工厂类中需要添加新的实例 ......

工厂方法模式简介

定义

定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

简单工厂 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 = ''