【趣解】工厂模式之简单工厂、工厂方法模式

时间:2022-10-02 15:21:30

今天,我们以找对象为例,分析一下工厂模式中的简单工厂工厂方法模式。

众所周知,找对象是个很复杂的过程。我们不使用工厂模式来模拟一下找对象过程。

代码如下:

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{@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)管理难度: 工厂方法模式的核心是一个抽象工厂类,而不像简单工厂模式, 把核心放在一个实类上。可拓展性更好,易于管理。

根据设计理论建议用工厂方法模式,但是实际上,我们一般都是使用简单工厂模式!