(老鸟略过)
之前的一篇简单方法模式连接地址
http://ysen.iteye.com/admin/blogs/542437
先来说说简单方法模式明显的优缺点
优点:将不同的业务实例在工厂内部实现,客户端只需要传个String类型的值就ok
缺点:如果增加新的女友(业务类型)那么就要修改switch分支条件(我这里用的if..else判断)这就破坏了设计模式的开放封闭原则,工厂方法模式就是解决这个问题的办法之一(不知道还有没有其它的方法忘高手指教)
在这里感谢hankesi2000的热心回帖
hankesi2000在上篇简单工厂方法中已经提到了工厂方法,我在这里顺便整理了下
下面是创建的对象的 接口
//基类
public class DreamGirl {
public void can_do_something_for_boy(){
}
}
下面都是具体实现
public class BeautifulGirl extends DreamGirl {
public void can_do_something_for_boy() {
System.out.println("陪老公逛街!!!");
}
}
public class LivelyGirl extends DreamGirl {
public void can_do_something_for_boy() {
System.out.println("陪老公聊天!!!");
}
}
public class LooksMediocreGirl extends DreamGirl {
public void can_do_something_for_boy() {
System.out.println("给老公做饭!!!");
}
}
public class SensibleGirl extends DreamGirl {
public void can_do_something_for_boy() {
System.out.println("给老公洗衣服!!!");
}
}
//接口:
public interface GirlFactory{
DreamGirl creatDreamGirl();
}
public class BeautifulGirlFactory implements GirlFactory{
public DreamGirl creatDreamGirl(){
return new BeautifulGirl();
}
}
public class LivelyGirlFactory implements GirlFactory{
public DreamGirl creatDreamGirl(){
return new LivelyGirl();
}
}
public class LooksMediocreGirlFactory implements GirlFactory{
public DreamGirl creatDreamGirl(){
return new LooksMediocreGirl();
}
}
public class SensibleGirlFactory implements GirlFactory{
public DreamGirl creatDreamGirl(){
return new SensibleGirl();
}
}
这样就是工厂方法了
现在来比较下简单工厂和工厂方法的优点缺点
首先比较客户端的调用(调用不同的业务女友一次):
a客户端调用简单工厂的话,客户端不需要知道工厂内部的实现,用户只需要传个字符串就能实例化具体的业务对象并调用具体的业务方法,这是简单工厂的优点。
b客户端调用工厂方法的话,显然将之前简单方法的中switch分支(业务判断)提到了客户端去判断了,显然不是我们所想要的。(这里利用反射可以解决该弱点)
设计模式的开放封闭原则:
上面说过了这是简单方法的缺点,但是工厂方法做到了这点,如果有新的女友加进来,那么so easy,只要加个新女友的 工厂方法就OK了 完全符合开放封闭的原则,完全不需要该switch。
这里还有个比较(调用一个业务女友多次):
简单工厂的话
//如果业务需求是这样子,需要调用多个同样类型的女友
DreamGirl girl1= new DreamGirlCreatFactory().creatDreamGirl(BeautifulGirl);
girl1.can_do_something_for_boy();
DreamGirl girl2= new DreamGirlCreatFactory().creatDreamGirl(BeautifulGirl);
girl2.can_do_something_for_boy();
DreamGirl girl3= new DreamGirlCreatFactory().creatDreamGirl(BeautifulGirl);
gir3.can_do_something_for_boy();
那么现在要将BeautifulGirl改成调用SensibleGirl 怎么办
要改好多,重复的太多代码就有了坏味道,经验告诉我们需要进行重构
看下工厂方法是怎么做的
GirlFactory girlFactory = new BeautifulGirlFactory();
DreamGirl girl1 = girlFactory.creatDreamGirl();
DreamGirl girl2 = girlFactory.creatDreamGirl();
DreamGirl girl3 = girlFactory.creatDreamGirl();
girl1.can_do_something_for_boy() ;
girl2.can_do_something_for_boy() ;
gir3.can_do_something_for_boy() ;
现在我们要将BeautifulGirl 改成SensibleGirl 那么客户端只需要改
GirlFactory girlFactory = new SensibleGirlFactory();就ok了
关键还是看需求选用不同的方法
hankesi2000 两种模式融合在一起也是非常不错的选择哈。
分享到:
相关推荐
找女朋友的方法-PMP方法论.pdf
找女朋友的方法.pptx
我写的也非常简单易懂,相信看过的朋友们都应该对简单工厂模式、工厂方法模式的意图、所能解决的问题及适用情景有一定的了解了。但是若要达到灵活运用,什么时候用,怎样用合适还不是看一篇文章就能解决的问题。呵呵...
程序员送给女友的基于JavaScript的高端3D相册源码程序员送给女友的基于JavaScript的高端3D相册源码程序员送给女友的基于JavaScript的高端3D相册源码程序员送给女友的基于JavaScript的高端3D相册源码程序员送给女友的...
程序员专属送给女朋友的礼物!在情人节送给女朋友感动到哭的礼物--3d动态相册。 代码已经弄好直接点击html文件就可以查看效果;自己修改文件夹image里的图片,换成女友的照片就可以发给女朋友啦!
不管是情人节还是什么节日,只要拥有它,女朋友看了绝对喜欢!!图片,每件事情的日期全部都改成自己的日期,图片替换成自己的图片。
表白源码送女朋友
一个简单的C#WinForm窗体包含3个功能,由3个按钮分别实现: ...适合给哄女朋友开心或者用来表白,程序设计非常简单属于一看就会的内容,这个只是一个dome,后续计划有一个完善整合的哄女朋友开心的窗体程序
直接点击html看效果,浏览器打开就好了, 1.文字在 take.js 里面改 或者 index.html里面给 2.女朋友的照片在assets/img 里面替换 背景图在img文件夹底下,
给女朋友做的微信公众号消息每日自动推送天气及纪念日通知教程,该教程为github每日自动线上运行版本。本人亲测妹子很喜欢~女孩子都喜欢这种用心做的东西! 1.最新版本 成品 +源码 +消息模板 (需要自己申请 天行 ...
找到女朋友的方法-SOP标准问题解决方法.pptx
系统方法教你找到女朋友
1.用于送给女朋友 2.使用了html+js 3.可修改源码
程序员为女朋友写的js 3D相册,立体多角度展示你女朋友图片 喜欢的可以收藏
程序员专用送给女朋友,收到的女朋友们都表示,哭了哭了T T
送给女朋友的源码
动态告白表白女朋友源码前端程序员的浪漫,是一款网页动态表白源码,直接点击html看效果,浏览器打开就好了,兄弟们可以上车了。...2、女朋友的照片在assets/img 里面替换 背景图在img文件夹底下。
对女朋友表白软件
程序员给女朋友用HTML5制作的3D相册 感觉挺漂亮。 整理里一个自己可以换相片
HTML静态网页设计作业,采用DIV+CSS布局,共有多个页面,使用CSS排版比较丰富,色彩鲜明有活力,顶部导航及底部 区域背景色为100%宽度。都是给学生定制的都符合学生考试期末作业的水平,有的有js,有的视频+音乐+...