博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式之工厂方法模式
阅读量:7156 次
发布时间:2019-06-29

本文共 2371 字,大约阅读时间需要 7 分钟。

工厂方法模式简介

定义

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

简单工厂 VS 工厂方法

  • 简单工厂:在工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。但是,当在工厂类中需要添加新的实例化对象类时,需要修改工厂类,这样就违背了“开-闭原则”。
  • 工厂方法:工厂方法模式就是为了解决简单工厂模式中存在的问题。通过创建工厂类接口,将具体的实例化的功能,下放到子类去实现,这样,当需要添加新实例化对象类时,就无需去修改工厂类,只需依据工厂类接口,实现一个新的类即可。这也体现出来了“依赖倒转”原则。但是,这样做的缺点是,将必要的逻辑判断下放到了客户端程序中,不是一个好的选择。当然,这样的情况,我们可以通过“反射”来解决。

案例

题目

用任意一种面向对象语言实现一个计算器控制台程序。要求输入两个数和运算符号,得到结果。

代码实现

#!/usr/bin/env python# _*_ coding utf-8 _*_#Author: aaronimport abcclass Operation(object):    def __init__(self, NumberA=0, NumberB=0):        self.NumberA = NumberA        self.NumberB = NumberB    def GetResult(self):        passclass AddOp(Operation):    def GetResult(self):        return self.NumberB + self.NumberAclass MinusOp(Operation):    def GetResult(self):        return self.NumberA - self.NumberBclass MultiOp(Operation):    def GetResult(self):        return self.NumberA * self.NumberBclass DivideOp(Operation):    def GetResult(self):        try:            return 1.0 * self.NumberA / self.NumberB        except ZeroDivisionError:            raiseclass 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 = ''

 

转载于:https://www.cnblogs.com/cjaaron/p/9075890.html

你可能感兴趣的文章
linux中nginx安装
查看>>
连接数据库报错:句柄无效
查看>>
使用update!导致的更新时候的错误信息不显示 ruby on rails
查看>>
AutoFac文档14(转载)
查看>>
TreeView 折叠所有
查看>>
Canvas——使用定时器模拟动态加载动画!
查看>>
移动端Css初始化
查看>>
混合拉普拉斯分布(LMM)推导及实现
查看>>
does not contain method named
查看>>
(C#)Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹
查看>>
一个while循环
查看>>
resize2fs
查看>>
c# 捕获一般获取不到的异常
查看>>
CCNP第三天 EIGRP综合实验
查看>>
JavaScript学习(十三)---RegExp对象
查看>>
leetcode_238. Product of Array Except Self_思维
查看>>
js 获取时间比较全,留备用(zhuan)
查看>>
IE6背景图片闪动问题
查看>>
非常不错的数据访问架构
查看>>
saltstack之(七)配置管理系统初始化init
查看>>