今天,我们以找对象为例,分析一下工厂模式中的简单工厂与工厂方法模式。
众所周知,找对象是个很复杂的过程。我们不使用工厂模式来模拟一下找对象过程。
代码如下:
public class FindLoverNoFactory { //每个人一开始没有男/女朋友 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; } }从代码中可以看到,如果要找到一个对象,得需要N步,好复杂啊!感觉好浪费时间啊!于是,许多人跑到政府那里说,找对象太辛苦啦,耽误我工作!然后政府一想,确实应该把找对象这个过程变简单些,那样他们才有时间去工作增加国家GDP。
过了一段时间,“非诚勿扰”这类婚介中心出来了,分为“男朋友”部门,“女朋友”部门,分别解决女生和男生找对象的问题。
新建一个婚介中心,代码如下:
//婚介中心 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{ @Override public People findLover() { Boy b = new Boy(); b.setName("小王"); b.setAge(20); return b; } }
//男性婚介中心 public class BoyLoverCenter implements LoverCenter{ @Override public 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)管理难度: 工厂方法模式的核心是一个抽象工厂类,而不像简单工厂模式, 把核心放在一个实类上。可拓展性更好,易于管理。
根据设计理论建议用工厂方法模式,但是实际上,我们一般都是使用简单工厂模式!