最近空闲时间想学习一下设计模式,之前读书的时候其实有这门课程,但是怎么说呢,上学的时候是当任务在学,感觉设计模式莫得卵用,随着工作的深入,渐渐发现设计模式的重要性,也许我们写代码不用设计模式也能运行,但是设计模式能帮助我们让代码更tm好,主要是需求一直在变,我们写代码要考虑扩展性什么的。。。
说到设计模式,之前其实也学过好几次,每次都是从入门到放弃(希望这次能多看完),主要这个过程比较枯燥。后来听说了《大话设计模式》这本书,今天想起来了就在网上下载了个pdf自己看,里面都是通过讲故事的方式介绍设计模式层层深入,一方面有情节,有代入感,不会太枯燥,另一方面也能帮助我们了解对应设计模式的使用场景。
话不多说,Begin
首先简单工厂模式属于创建型模式,创建型模式主要的特点是将对象的创建和使用隔离,使用者不需要了解创建的具体过程,而且修改其中一方并不会对另一方产生影响。
简单工厂模式
首先被创建的对象必须有多种,并且拥有同一抽象父类,父类通常有一个抽象方法,具体子类根据各自需求实现该方法。
工厂类通过静态方法的参数进行判断,返回不同类型的对象,使调用者忽略了创建细节。
这里我们随便举个例子吧,比如企业招人吧,毕竟这个离程序员比较贴近。
最近项目紧,老板让HR多招几个程序员,以免现有程序员猝死了没人接班延误工期,那么Java、PhP、Android都各招一个当备胎吧。
首先分析一波:这个例子中,需求方是老板,HR就是个简单工厂,创建对象是程序员(当然如果更抽象一点可以求职者,就可以兼容之后的招销售、招售后了),程序员有很多子类,就不一一列举了。
下面写代码吧,为了方便不同的读者看就写点伪代码吧(绝对不是因为我懒)
首先,得有个抽象父类,并且有个抽象方法,描述该类对象的共同行为。
抽象类 程序员{
抽象方法 写Bug();
}
然后就是具体的实体类
类 Java程序员{
方法 写Bug(){
//写Java Bug
}
}
类 Php程序员{
方法 写Bug(){
//写Php Bug
}
}
类 Android程序员{
方法 写Bug(){
//写Android Bug
}
}
接着就是HR这个工厂类出来干活了
类 HR{
静态方法 招人(招人类型){
if(招人类型==JAVA){
return new Java程序员();
}else if(招人类型==PHP){
return new Php程序员();
}else if(招人类型==Android){
return new Android程序员();
}else{
//抛出异常,我招不了拆弹专家什么的
}
}
}
最后就是调用了
//情景
老板:HR,JAVA程序员猝死了,快给我一个程序员补上
程序员 xx=HR.招人(JAVA)
xx.写Bug()
老板:HR,PHP程序员猝死了,快给我一个程序员补上
程序员 xxx=HR.招人(PHP)
xxx.写Bug()
老板:HR,Android程序员猝死了,快给我一个程序员补上
程序员 xxxx=HR.招人(Android)
xxxx.写Bug()
老板:那谁,HR猝死了,快给我一个HR补上
X:惹不起,告辞
1.抽象父类+抽象方法
2.具体子类+具体实现
3.工厂类+静态工厂方法
4.调用方通过调用工厂内的静态方法获取父类对象持有(实际是子类,但是调用方并不关心,只会直接调用父类抽象方法,然后根据多态自动调用具体子类实现)
1、责任分离:工厂类负责创建对象,外部忽略创建细节
2、可以通过配置文件的方式降低新增子类引起的工厂类修改和具体类的引入,提高灵活程度
1、工厂模式的重要性太大,一旦工厂类出现问题,整个程序都无法正常运行。
2、添加新的子类时,需要产生新的类和修改工厂类(可通过上述所说的配置文件解决)
3、工厂中的静态方法导致无法通过继承和多态的方式进行方法扩展
1、子类不能过多,否则会造成工厂类逻辑臃肿
2、调用者不需要了解创建的具体细节,只需要根据特定特征值获取指定类型的对象
小小的一个简单工厂模式就用到了封装、继承、多态,即面向对象的三大特性,也许我们平时写代码的时候很少注意这些,但是你学得多了,当你需要的时候才会有选择的余地,千里之行,始于足下。
学习中主要参考学习了以下两本书:程杰《大话设计模式》 刘伟主编的软件工程教材《设计模式》(毕业后没丢,搬了几次家一直带在身边,偶尔看看)。先看前者,以趣味开始,然后再看第二个巩固深入,标准的教科书,很仔细,但相对也比较刻板乏味。
建议还是亲自看一看这本书,自己理解比较深刻,最好能结合生活自己写个例子,不要跟着别人的思想走,要在别人的理解上延伸出自己的理解,你喜欢吃,你喜欢吃,简单工厂就是饭馆,你喜欢玩,简单工厂就是玩游戏,往自己喜欢的方向延伸才会记忆深刻。
End