今天,我们以找对象为例,分析一下工厂模式中的简单工厂与工厂方法模式。
众所周知,找对象是个很复杂的过程。我们不使用工厂模式来模拟一下找对象过程。
代码如下:
public class FindLoverNoFactory {从代码中可以看到,如果要找到一个对象,得需要N步,好复杂啊!感觉好浪费时间啊!于是,许多人跑到*那里说,找对象太辛苦啦,耽误我工作!然后*一想,确实应该把找对象这个过程变简单些,那样他们才有时间去工作增加国家GDP。
//每个人一开始没有男/女朋友
private static People b_gFriend = null;
public static void main(String[] args) {
//如果需要找一个男/女朋友
//以男生为例(女生同样的道理)
//1.心中开始构想一个女朋友
Girl dreamGril = new Girl();
//2.为这个女生设置名称
dreamGril.setName("小美");
//3.为这个女生设置年龄
dreamGril.setAge(20);
//构想完成之后找到自己的女朋友啦!
b_gFriend = dreamGril;
}
}
过了一段时间,“非诚勿扰”这类婚介中心出来了,分为“男朋友”部门,“女朋友”部门,分别解决女生和男生找对象的问题。
新建一个婚介中心,代码如下:
//婚介中心然后我们再来模拟一下找对象过程( 简单工厂模式)。
public class LoverCenter{
public static People findLover(String sex){
if("男".equals(sex)){//“男朋友”部门
Boy b = new Boy();
b.setName("小王");
b.setAge(20);
return b;
}else if("女".equals(sex)){//“女朋友”部门
Girl g = new Girl();
g.setName("小美");
g.setAge(20);
return g;
}else{
return null;
}
}
}
public class FindLoverSimpleFactory {哇!找对象居然这么简单了。
//每个人一开始没有男/女朋友
private static People b_gFriend = null;
public static void main(String[] args) {
//如果男生需要找一个女朋友,直接找婚介中心分配即可。(女生同理)
b_gFriend = LoverCenter.findLover("女");
}
}
可是好景不长,大家一看既然婚介中心找对象这么简单了,那么,也为自己的宠物找对象!
于是婚介中心又添加了“小猫”部门,“小狗”部门........
久而久之,*感觉好烦啊,因为这对于婚介中心来说,就违反了“把事情变简单”的目的(违反面向对象得开闭原则)。
*又做了一个伟大的决定,把部门分开,各自单独建立一个中心,你们就别来烦我了!
代码如下:
//婚介中心
public interface LoverCenter{
public People findLover();
}
//女性婚介中心public class GirlLoverCenter implements LoverCenter{@Overridepublic People findLover() {Boy b = new Boy();b.setName("小王");b.setAge(20);return b;}}
//男性婚介中心public class BoyLoverCenter implements LoverCenter{@Overridepublic People findLover() {Girl g = new Girl();g.setName("小美");g.setAge(20);return g;}}然后我们再来模拟一下找对象过程( 工厂方法模式)。
public class FindLoverFactoryMethod {于是,各类婚介中心分离开来,*也清净了很多。
//每个人一开始没有男/女朋友
private static People b_gFriend = null;
public static void main(String[] args) {
//如果需要找一个男/女朋友
//以男生为例(女生同样的道理)
LoverCenter loverCenter = new BoyLoverCenter();
b_gFriend = loverCenter.findLover();
}
}
以上趣解了两种工厂模式,我们来看下UML图
1.无工厂模式
2.普通工厂
3.工厂方法
总结:
简单工厂模式VS工厂方法模式
1)结构复杂度:简单工厂模式优胜。
2)代码复杂度:简单工厂模式占优。
3)管理难度: 工厂方法模式的核心是一个抽象工厂类,而不像简单工厂模式, 把核心放在一个实类上。可拓展性更好,易于管理。
根据设计理论建议用工厂方法模式,但是实际上,我们一般都是使用简单工厂模式!