(老鸟略过)
之前的一篇简单方法模式连接地址
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 两种模式融合在一起也是非常不错的选择哈。