设计模式---简单工厂
来源:互联网 发布:java将字符串转为数组 编辑:程序博客网 时间:2024/05/18 01:59
工厂模式:给所有产品抽象出一个公共的接口,工厂类根据需要实例化不同的产品。
《大话设计模式》这本书中给出实现计算器运算例子:
一.简单工厂的好处分析如下:
1.将所有算法抽象出一个公共基类“运算类”,提供GetResult公共接口。工厂类根据需要实例化不同的“产品”即具体的算法。而客户端只需要调用公共的GetRestult算法完成计算即可。运算类的扩展不会影响到客户端计算的逻辑。
2.抽象出简单工厂类后,算法对象的创建被集中化,使得算法对象的创建和使用解耦。
二.简单工厂的缺点:
工厂类中存在Switch或if ….else的结构,使得功能的演进偶可能对原有代码产生波及,违背了“开放封闭原则”。
三.示例:
下面分别用Python和ITcl语言演示简单工厂,为了代码不依赖具体项目上下文环境,便于理解,例子很简单。这里要实现一个关于“打球”的文本打印,球的种类可能有多种,根据不同类型打印不同的字样。
Python实现示例子
from abc import ABCMeta, abstractmethodclass Ball: @abstractmethod def play(self): passclass Football(Ball): def play(self): print('play Football')class VollyBall(Ball): def play(self): print('play Volleyball')class Basketball(Ball): def play(self): print('play Basketball')class BallSelecter: def __init__(self, type): self.__type = type def get_ball(self): if self.__type == 'Football': return Football() elif self.__type == 'Volleyball': return VollyBall() elif self.__type == 'Basketball': return Basketball() else: return Nonemyball = BallSelecter('Basketball').get_ball()myball.play()
ITcl实现示例子
itcl::class Ball { #打球的公共接口 public method Play {} {}}itcl::class FootBall { public method Play {} {puts "play FootBall"} destructor { puts "FootBall destroy" }}itcl::class VollyBall { public method Play {} {puts "play VollyBall"} destructor { puts "VollyBall destroy" }}itcl::class Factory { constructor {} { # 确保抽象类不能被初始化 if {[namespace tail [info class]] == "Factory"} { error "Error: can't create Factory objects - abstract class." } } #强调内容*#强调内容*#在Incr Tcl里,工厂方法实现了在父类的名词空间里创建对象的方式。 #在下面这个工的例子里,尽管你想要在方法被调用的名词空间 #里创建新的对象, #尽管通常情况下是在全局名词空间内,但也有可能是其它任何地方,所 #以我们使用uplevel命令确保 #在方法被调用的名词空间内创建对象。并且使用namespace which获得 #该对象可以传递到其它任何名词空间的对象名字。 public proc CreatOperate { XinBie } { #itcl::local Ball b #Ball b switch $XinBie { "Nan" { return [uplevel {namespace which [FootBall #auto]}] #return [FootBall #auto] } "Niu" { #::test::vollyBall0 return [uplevel {namespace which [VollyBall #auto]}] #return [VollyBall #auto] } } return $b }}set Select "Niu"namespace eval test { #Ball b set b [Factory::CreatOperate $Select] #::test::vollyBall0 puts $b $b Play}
阅读全文
0 0
- 简单工厂设计模式
- 设计模式-----简单工厂
- 简单工厂设计模式
- 设计模式:简单工厂
- 设计模式 - 简单工厂
- 设计模式 简单工厂
- 【设计模式】【简单工厂】
- 简单工厂设计模式
- 简单工厂设计模式
- 设计模式--简单工厂
- 简单工厂设计模式
- 简单工厂设计模式
- 设计模式------------简单工厂
- 设计模式--简单工厂
- 简单工厂设计模式
- 设计模式---------简单工厂
- 设计模式--简单工厂
- 简单工厂设计模式
- 数据装载
- django学习——模板中判断相等与否的两种用法ifequal与if
- java中常用的流程控制语句
- 每日产品辣评:谷歌连发五款新品,却还是被苹果抢了头条
- 颠覆式创新 新世纪机器人推出智能平衡车igo
- 设计模式---简单工厂
- session和cookie的联系和区别
- JavaWeb入门必须懂
- PyQt5学习教程8:使用Box Layout布局控件
- 从核外电子(electron)到应用软件(software)------谈谈抽象和认知
- 451. Sort Characters By Frequency (sort)
- MyBatis 基于Mapper的增删改查示例(Spring IOC注入)
- Codeforces Round #441 (Div.2)
- 线性表之基于数组的实现