作为java开发人员,我们对面向对象的特性十分熟悉,随便上网搜索,封装,继承,多态这三大特性有各种版本各种说法解释,各圆其说,只能说每一个人对一个事物的理解角度不一样,描述方式不一样,并无绝对对错。初学者通病,我们在实现一个功能的时候很容易就按照面向过程的思想来编程,为啥呢,因为我们很容易在计算机的角度来思考问题。封装比较容易理解,就像你要造一辆车,你只需要把轮胎,车架,发动机.......零件组装起来就可以,不需要你去造轮子,自己发明一个发动机,而封装的好处是什么?
这么理解,如果你不用封装,说明一辆车,小到一颗螺丝钉你都需要你一步一步造出来,费时巨大,好不容易造好一辆车,突然一个客户说这个发动机不好,或者轮胎不合心意,要替换,那你现在怎么办?这些零件你没法拆下来,或者说你拆了发动机后,水箱的设计可能也需要动,排气管也需要重新布置,牵一发而动全身,相当于又造了一辆新车。从客户角度来说,完全合理,就是让你换个轮胎,换个发动机,但是从程序实现角度,你这工作量是非常巨大的。我们一直强调面向对象方便开发,但是没法体现出任何方便之处。但是封装就是相当于把各种零件都给你配好,而且各种接口的规格也给你说明白,你就相当于只需要选择好的零件,按照需要的螺丝大小,把车组装起来,各个零件之间的内部的东西不相互影响,人家需要换不同的轮胎你就换,而这些零件就需要你封装好,所以一辆车零件可能轮胎来自日本,车门来自德国.......这就是封装的好处。还有两个特性,我们会在以后的学习中慢慢体会到其中的乐趣,现在就点到为止。
下面是程杰老师关于简单工厂模式的UML图,关于UML图含义以及怎么画大家可以百度一下,到处都是
我们从这个可以看出这实现了一个计算器的功能,把运算符封装成一个类,然后下面的加减乘除就是继承了运算符类的具体类,这就是继承的好处,假如你希望增加一个开根运算,你只需要再在下面实例化一个开根类,功能可以不断扩展,而且不需要去改变运算类这个抽象类,这样就保证了很好的松耦合特性。但是简单工厂类有啥用呢,我们需要哪种具体的类我们继承再实例化不就好了,我们为什么还要工厂类呢。其实简单工厂类,实现的功能就是把这个实例化过程封装起来,让选择实例化哪个类这个选择过程交给简单工厂类来实现。我们在客户端只需要给简单工厂类传一个参数,就可以自动实例化出我们需要的实例,客户端和实例化过程就被隔离了。当然了如何实例还要你在工厂类中实现。说了半天我知道大家都很懵,那只有举例子才是王道。
假设一个场景,有一家球鞋代工厂,阿迪和nike都做,我想请他们做一双鞋(当然了现实生活中你让人家只做一双是不太可能的)那按照简单工厂模式应该怎么弄,首先你要一个鞋这个抽象类,不是指具体指某种鞋。
那能做阿迪和nike两种具体的鞋,需要继承。
然后是选择的工厂类:
最后你在客户端只需要传入一个参数,nike或者addidas,就可以给你做出一双鞋,就像客人只需要说我要nike或者addidas,工厂就自动给你造一双鞋,当然了,如果你要求越明确,就越好呗,比如你要nike ,欧文五,凯尔特人配色这些参数你说出来,不用管怎么生产,就能拿到鞋,当然了,如果很多客人都来定制鞋,你工厂里面的模具越来越多,因为你造一双鞋就要做一些模具,到最后你可能找模具得很久,还得不断做模具,是吧,这就是简单工厂的弊端,怎么解决,那就是另一个设计模式的作用了。