代码无错就是无优?简单工厂模式------大话设计模式

                                                                初学者代码的毛病

首先,是代码不足的地方的改进

除了以上代码的问题,还要注意代码的规范

这是修改后的代码的内容,但是这个代码并没有用面向对象的编程方法去实现 

所有编程初学者都会有这样的问题,就是碰到问题就直觉地用计算机能够理解的逻辑来描
述和表达待解决的问题及具体的求解过程。这其实是用计算机的方式去思考,比如计算器这个程序,先要求输入两个数和运算符号,然后根据运算符号判断选择如何运算,得到结果,这本身没有错,但这样的思维却使得我们的程序只为满足实现当前的需求,程序不容易维护,不容易扩展,更不容易复用。从而达不到高质量代码的要求。

所以,

要实现第一,要改的地方只需更改要改之字,此为可维护。第二,这些字并非用完这次就无用,完全可以在后来的印刷中重复使用,此乃可复用。第三,此诗若要加字,只需另刻字加入即可,这是可扩展。第四,字的排列其实可能是竖排可能是横排,此时只需将活字移动就可做到满足排列需求,此是灵活性好。

这样改的好处是:因为我们原先所写的程序,不容易维护,灵活性差,不容易扩展,更谈不上复用,因此面对需求变化,加班加点,对程序动大手术的那种无奈也就成了非常正常的事了。之后当我们能学习了面向对象的分析设计编程思想,开始考虑通过封装、继承、多态把程序的耦合度降低,传统印刷术的问题就在于所有的字都刻在同一版面上造成耦合度太高所致,开始用设计模式使得程序更加的灵活,容易修改,并且易于复用。

 

 通过这次修改就把业务和界面的代码完全分开了,但仅此而已,实在谈不上完全面向对象,现在只用了面向对象三大特性中的一个,还有继承,多态还没有使用。

所以,

我们应该通过继承,多态,把加减乘除等运算分离,修改其中一个不影响另外的几个,增加
运算算法也不影响其他代码

Operation代码

加减乘除类

这个是一个运算类,它有两个Number属性,主要用于计算器的前后数,然后有一个虚方法GetResult(), 用于得到结果,然后我把加减乘除都写成了运算类的子类,继承它后,重写了GetResult()方法, 这样如果要修改任何一个算法,就不需要提供其他算法的代码了。

但问题来了,我如何让计算器知道我是希望用哪一个算法呢?”(如何实例化对象的问题)

对于这个问题,我们可以通过“简单工厂模式”,也就是说,到底要实例化谁,将来会不会增加实例化的对象,比如增加开根运算,这是很容易变化的地方,应该考虑用一个单独的类来做这个创造实例的过程,这就是工厂,来,我们看看这个类如何写。

简单运算工厂类

客户端的代码

现在,我们只需要输入运算符号,工厂就实例化出合适的对象,通过多态,返回父类的方式实现了计算器的结果。

界面的实现就是这样的代码,不管你是控制台程序,Windows 程序,Web 程序,PDA
或手机程序,都可以用这段代码来实现计算器的功能,如果有一天我们需要更改加法运算,我们只需要改OperationAdd就可以了。
如果我们需要增加各种复杂运算,比如平方根,立方根,自然对数,正弦余弦等,只要增加相应的运算子类就可以了,当然还需要去修改运算类工厂,在switch中增加分支。

接下来我们来看看这几个类的结构图:

UML类图        

这张图就包括了UML类图中的基本图示法

首先我们看那个动物’矩形框,它就代表一个类(Class)。 类图分三层,第- -层显示类的名称,如果是抽象类,则就用斜体显示。第二层是类的特性,通常就是字段和属性。第三层是类的操作,
通常是方法或行为。注意前面的符号,*+’ 表示public,‘-' 表示private,“#’ 表示protected.”

然后注意左下角的‘飞翔’,它表示-一个接口图,与类图的区别主要是顶端有<<interface> >
显示。第一行是接口名称,第二行是接口方法。接口还有另一种表示方法,俗称棒棒糖表示法,就是唐老鸭类实现了‘讲人话’(鸭子本来也有语言,只不过只有唐老鸭是能讲人话的鸭子) 的接口。

接下来就可讲类与类,类与接口之间的关系了。可首先注意动物、鸟、鸭、唐老鸭之间
关系符号,它们都是继承的关系,继承关系用空心三角形+实线来表示。

在举例的几种鸟中,大雁是最能飞的,我让它实现了飞翔接口。实现接口用空心三角形+虚线
来表示。

看看企鹅和气候两个类,企鹅是很特别的鸟,会游不会飞。更重要的是,它与气候有很大
的关联。我们不去讨论为什么北极没有企鹅,为什么它们要每年长途跋涉。总之,企鹅需要‘知道’气候的变化,需要'了解’气候规律。当一个类‘知道'另一个类时,可以用关联( sciation)。关联关
系用实线箭头来表示。

我们再来看大雁与雁群这两个类,大雁是群居动物,每只大雁都是属于一个雁群,一个雁
群可以有多只大雁。所以它们之间就满足聚合(Aggregation) 关系。聚合表示一种弱的‘拥有’关系,
体现的是A对象可以包含B对象,但B对象不是A对象的一部分[DPE]。聚合关系用空心的菱形+实线箭头来表示。
 

合成(Composition,也有翻译成‘组合’的)是一种强的‘ 拥有’关系,体现了严格的部分和整体的关系,部分和整体的生命周期一样[DPE]。在这里鸟和其翅膀就是合成(组合)关系,因为它们是部分和整体的关系,并且翅膀和鸟的生命周期是相同的。合成关系用实心的菱形+实线箭头来表示。另外,你会注意到合成关系的连线两端还有一一个数字‘1’ 和数字‘2’, 这被称为基数。表明这一端的类可以有几个实例,很显然,一个鸟应该有两只翅膀。如果-一个类可能有无数个实例, 则就用‘n' 来
表示。关联关系、聚合关系也可以有基数的。

动物几大特征,比如有新陈代谢,能繁殖。而动物要有生命力,需要氧气、水以及食物等。
也就是说,动物依赖于氧气和水。他们之间是依赖关系(Dependency), 用虚线箭头来表示。

 

                                                                        结束标语

编程是一门技术,更加是一门艺术,不能只满足于写完代码运行结果正确就完事,时常考虑如何让代码更加简练,更加容易维护,容易扩展和复用,只有这样才可以真正得到提高。写出优雅的代码真的是一种很爽的事情。UML类图也不是一学就会的, 需要有一个慢慢熟练的过程。所谓学无止境,其实这才是理解面向对象的开始呢。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值