浅谈设计模式:简单工厂

 

我认为各行各业都是相通的,思想这种东西是一种指导方法,要不然哲学为什么会是所有学科的科学。所以无论你喜欢不喜欢编程,都有一定借鉴。...



目前这个社会土豪横行比财力,流氓痞子比武力,程序员不说懂点设计模式都不好意思见人。由于项目需要,之前面试的时候也被设计模式虐过,于是乎“发粪涂墙”看设计模式。这个《浅谈设计模式》文章我将会持续写下去,也算我个人学习设计模式的一个总结和分享。我认为各行各业都是相通的,思想这种东西是一种指导方法,要不然哲学为什么会是所有学科的科学。所以无论你喜欢不喜欢编程,都有一定借鉴。

其实简单工厂严格上来说不算是一种设计模式,是一种编程思想(面向对象),习惯。在谈简单工厂之前。对于几个概念需要更加有清楚的认知,下面还有生动的例子辅助理解。

继承:继承是一种类与类之间强耦合的关系。这种强耦合的关系有优点,也有缺点。优点:继承使得多个具有共同方法的子类不必要重复写,可以将所有方法的公共部分放在父类中,类似于代码共享,使得代码的可维护性大大提升。缺点:子类受到父类的制约,父类有变子类也必须改变。父类中实现的细节也容易暴露。就像我们开启子线程有两种方法,一般推荐使用实现runnable接口的方法。继承关系有三个重要的点:如果子类继承父类,1.子类拥有父类非private的属性和功能;2.子类具有自己的属性和方法(父类没有的);3.子类可以用自己的方式实现父类的方法(方法重写)。

多态:继承同一个父类的多个不同子类对象,用它们自己的实现,来实现用一个父类的方法。

抽象类:类和方法都声明为abstract,称为抽象类和抽象方法。1.抽象类不能实例化;2.抽象方法必须被子类重写的方法。3.一个类中包含有抽象方法那么这个类就必须是抽象类。无论它是否还包含其他一般的方法。4.抽象方法是没有方法体的。有一句很经典的话"抽象类拥有尽可能多的共同代码,拥有尽可能少的数据",抽象方法就是用来继承的。

接口:接口和抽象类有点类似,但是还是不一样。接口使用interface声明;接口也不可以实例化,没有构造方法;不能有任何修饰符,public,private等;方法没有方法体;接口是一对多,既一个类只能继承一个类,但是可以实现多个接口;实现接口的类就必须要实现接口中所有的方法和属性。(在下面我会用例子去说明接口和抽象类的一些区别)。

我就拿顾漫的烂言情小说来举例子。顾漫和天蚕土豆两个人各有三本书套路简直是一模一样。顾漫成名小说《何以笙箫默》,土豆成名《斗破苍穹》,成名以后顾漫写的《微微一笑很倾城》,土豆写了《武动乾坤》,后来顾漫又写了《杉杉来吃》,土豆《大主宰》。对于这两人的写作套路,我想说他们才是最好的程序员。他们对于面向对象的理解的之深刻,难怪他们能那么捞金。我来分析下他们的小说的具体套路。

顾漫的第一本《何以》,塑造了一个高冷男神---何以琛;大律师,校园风云人物,才子,各种Buff,光环,大帅逼。第二本《微微》,高冷男神---肖奈;天才程序员,校园风云人物,才子,各种Buff,光环,大帅逼。第三本《杉杉》,高冷男神---封腾;大总裁,土豪,各种Buff,才子(法语英语,懂注会),大帅逼。我用UML类图来总结,如图所示(工具为Astah Community,喜欢的可以自己去下载)。



很明显,作者定义了一个父类---高冷男神,这个父类用于作者很多作品下的的子类男主角,那么这个类其实就可以用abstract修饰,也就是抽象类。这个父类就是用类被继承的。其中父类的“多才多艺”被看为抽象方法,子类必须重写,也就是,每个子类男主角“多才多艺”的内容可以自己实现。看下面一张类图。



篮球,游泳,跆拳道都是接口,如图中肖奈实现了"打球",一个类可以实现多个接口,也就是只要主角需要,可以在人物设定中选用这些已经封装好的接口,可以同时会“打球”,“游泳”,“跆拳道”。由此可以看出从设计的角度,抽象类是先有子类再有父类,是子类中公共部分的泛化提取;接口是根本不知道是否存在子类,实现的方法未知,预先的一个定义以便随时调用。抽象类是对类的抽象;接口是面对行为方法的抽象。

于是如果我们按照套路来写小说,写的其实不会比这些作家写的差,我们预先封装一些类,定义一些接口,故事脉络就是技术框架,词句优美程度就是业务需求。设计一个新的主角人物如下图。赵四,我们为赵四写一些接口让他调用,“上天入地”。故事脉络就是开源库了,比如“伦理爱情”——女友是失散多年的妹妹,“乡村爱情”——高富帅喜欢村姑于是变卖家产去乡下承包鱼塘,等等。

这就是基于面向对象的思想来理解文科的东西,就像阿尔法狗即便战胜了李世石也不代表围棋已经没有继续下去的必要,因为人类发明围棋的那种思想孕育出来的竞技方法可能阿尔法狗是很强,但是里面蕴含的哲理,思想,还不是一个机器人可以否定掉的。思想是最关键的。

接下来简单谈下简单工厂。它的UML类图如下图所示。



下面将这四个模块的代码贴出来,我们以快餐为例子,薯条,汉堡,两种为我们的具体产品。





小明,就是一个客户类,实现功能界面的类。这个类就是当小明想要吃“汉堡”的时候他就构造一个“工厂”,让这个“工厂”为他生产他想要吃的东西。或者用下面这种反射的写法可以使代码更加简洁。



以上的实现方式就称为简单工厂模式,也可以称为静态工厂,严格上不是一种设计模式,是工厂方法模式的弱化版本,目的就是降低对象,类之间的耦合度。

下面举个Android源码中的一个简单的应用,我们使用过NotificationManager,SensorManager等等。它们都是通过系统方法“getSystemService”来获取,我从网上看了下framework层的ContextImpl.java中的代码,实现也不是很复杂,用到的思想也是上面讲到的,相关的资料就不重复,提供个网址有兴趣的自行了解。http://blog.csdn.net/ahjxly/article/details/20777963

下一篇文章可能会谈工厂方法模式,或者是其他的,都不一定。喜欢朋友可以转载,转载请务必说明出处“菜鸟编程自习室”,本文原创,尊重劳动成果。


    关注 菜鸟编程自习室


微信扫一扫关注公众号

0 个评论

要回复文章请先登录注册