zoukankan      html  css  js  c++  java
  • 设计模式之工厂方法模式

    工厂方法模式简介

    定义

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

    简单工厂 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('
    #--  input q to exit any key to continue')
            try:
                ch = str(input())
            except:
                ch = ''
    
  • 相关阅读:
    Rocky Linux8国内镜像源
    强制缓存和协商缓存的区别
    从源码来看VUE的执行流程
    plugin
    判断数据类型的方法
    获取函数参数
    BFC
    VUE的$nextTick
    HTTP
    JavaScript创建和触发自定义事件
  • 原文地址:https://www.cnblogs.com/cjaaron/p/9075890.html
Copyright © 2011-2022 走看看