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

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

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

代码如下:

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

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


猜你喜欢

转载自blog.csdn.net/a445849497/article/details/58288802
今日推荐