工厂方法模式Python版--雷锋依然在人间
来源:互联网 发布:2016淘宝女装店铺名字 编辑:程序博客网 时间:2024/05/18 22:42
简介
工厂方法模式定义了一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个雷的实例化延迟到其子类。
工厂方法模式的本质就是延迟到子类来选择是实现。
代码实现
class OperationFactory: operators = {} operators['+'] = OperationAdd() operators['-'] = OperationSub() operators['*'] = OperationMul() operators['/'] = OperationDiv() def GetResult(self, ch): if ch in operators: op = operators[ch] else: op = UndefOperator() return opif __name__ == "__main__": oper = OperationFactory() oper.GetResult("+") oper.NumA = 1 oper.NumB = 2 print oper.GetResult()
用工厂模式实现计算器的UML关系图
class IFactory: def CreateOperation(self): passclass AddFactory(IFactory): def CreateOperation(self): add = OperationAdd()return addclass SubFactory(IFactory): def CreateOperation(self): sub = OperationSub()return subclass MulFactory(IFactory): def CreateOperation(self): mul = OperationMul()return mulclass DivFactory(IFactory): def CreateOperation(self): div = OperationDiv()return divif __name__ == "__main__": af = AddFactory() oper = add.CreateOperation() oper.NumA = 1 oper.NumB = 2 print oper.GetResult()简单工厂模式最大的优点在于:工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态的实现实例化相关的类,对于客户端来说,去除了与躯体产品的依赖。
工厂模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在的,工厂方法把简单工厂的内部逻辑移到了客户端代码进行。你想要加功能,本来是改工厂类的,现在是修改客户端。
雷锋工厂
class LeiFeng: def Sweep(self):print "Sweep" def Wash(self): print "Wash" def BuyRice(self): print "Buy rice"class Undergraduate(LeiFeng): passclass Volunteer(LeiFeng): pass
简单工厂模式的代码实现
class SimpleFactory: def CreateLeiFeng(self, type): if type is "Volunteer": result = Volunteer() elif type is "Undergraduate": result = Undergraduate() return resultif __name__ == "__main__": s = SimpleFactory() v = s.CreateLeiFeng("Volunteer") v.Sweep() v.Wash()工厂模式的代码实现
class IFactory: def CreateLeiFeng(self): passclass UndergraduateFactory(IFactory): def CreateLeiFeng(self): return Undergraduate()class VolunteerFactory(IFactory): def CreateLeiFeng(self): return Volunteer()if __name__ == "__main__": f = UndergraduateFactory() u = f.CreateLeiFeng() u.Sweep() u.Wash()
工厂方法模式的优缺点
优点:
- 可在不知具体实现的情况下编程
- 更容易扩展对象---只要在已有代码中新加入一个子类提供的新的工厂方法实现,然后在客户端使用这个新的子类即可
- 连接平行的类层次----工厂方法除了创造产品对象外,在连接平行的类层次上也大显身手
- 具体产品对象和工厂方法的耦合性
工厂方法需要创建产品对象的,也就是需要选择具体的产品对象,并创建他们的实例,因此具体产品对象和工厂方法是耦合的。
何时选用工厂方法模式
- 如果一个类需要创建某个接口对象,但不知道具体的实现,这个时候可以选用工厂方法模式,把创建对象的工作延迟到子类中去实现。
- 如果一个类本身是希望由它的子类来创建所需的对象的时候,应该使用工厂方法模式。
相关模式
- 工厂方法模式和简单工厂模式,以及抽象工厂模式
- 工厂方法模式和模板方法模式
0 0
- 工厂方法模式Python版--雷锋依然在人间
- 【设计模式】雷锋依然在人间 --- 工厂方法模式
- 雷锋依然在人间 --- 工厂方法模式
- 雷锋依然在人间—工厂方法模式
- 《大话设计模式》之--第8章 雷锋依然在人间----工厂方法模式
- 《大话设计模式》之--第8章 雷锋依然在人间----工厂方法模式
- 第8章 雷锋依然在人间-工厂方法模式 大话设计模式
- 《大话设计模式》--雷锋依然在人间--工厂方法模式<Factory Method>(8)
- 第八章 雷锋依然在人间-工厂方法模式(读书笔记)
- 第八章 雷锋依然在人间---工厂方法模式(读书笔记)
- 8. 雷锋依然在人间 -- 工厂方法模式(Factory Method Pattern)
- 《大话设计模式》—— 读后感(8)雷锋依然在人间——工厂方法模式
- 大话设计模式-第08章 雷锋依然在人间--工厂方法模式
- 《大话设计模式》——读后感 (5)雷锋依然在人间?——工厂方法模式
- 工厂方法模式-雷锋工厂-大话设计模式
- 工厂方法模式-雷锋工厂-大话设计模式 .
- Python设计模式1--工厂方法模式
- 设计模式:工厂方法模式(Python)
- Linux内核分析 学习笔记之反汇编分析
- 线性判别分析 (Linear Discriminant Analysis) (一)
- Java中使用MemCached
- iOS开发:NSDate时区与格式化问题
- java学习--java性能优化
- 工厂方法模式Python版--雷锋依然在人间
- 现代经济感悟(4)-为什么一分钱一分货,两分货却要一块钱
- ABAP基础-数据更新至数据库操作解析
- 【好习惯】我的前端架构养成记之整洁的工作流
- Linux 环境开发--gcc 编译以及动态连接
- 基于高通AR SDK的Demo总结(一)——常规3D模型的行为脚本
- Objective-C基础——核心语法-点语法法和成员变量的作用域
- Pig简单入门
- 通过Eclipse对Android项目生成APK数字签名