1776年3月,亚当·斯密第一次在《国富论》中第一次提出了劳动分工的观点,其详细阐述了劳动分工对于提高劳动生产率和增加国民财富具有重要的作用。也就是说,如果我们要吃玉米,我们没必要自己去买块地,然后种植、收割;如果我们想穿鞋子,我们也没必要自己买机器,然后买材料、做鞋。原因很简单,如果我们事事亲力亲为,那么我们的时间都被占据了,我们腾不出来时间做其他重要的事情。而且,与专业做鞋子的工人相比,无论款式、还是舒适度,我们都差了一大截。
因此,社会分工的优势告诉我们,我们只需做好自己所擅长的东西就够了,而对于那些不是自己本职工作的事情,我们就放心交给那个领域的组织就好,而这个组织的最小单位其实就是工厂。
面向对象其实就是社会学的一个缩影,任何一个设计模式,其实在现实中都有迹可寻,专家们也绝不是靠瞎想诌出来的东西。工厂模式的初衷其实很简单,如果我们需要一个实例,没必要自己是实例化,把new的过程交给工厂不是更好吗?何必事事都得自己来做?
比如下面的实例:
我们有两台机器,一台用来造鞋子,一台用来造鞋带:
public interface Machine {
/**
* 机器用来生产产品
*/
void produce();
}
public class ShoelaceMachine implements Machine {
@Override
public void produce() {
System.out.println("生产鞋带。");
}
}
public class ShoeMachine implements Machine {
@Override
public void produce() {
System.out.println("生产鞋。");
}
}
如果,如果自己动手,丰衣足食,那么实现过程是这样的,
public class Main {
public static void main(String[] args) {
String type = "shoe";
if (type.equals("shoe")) {
Machine machine = new ShoeMachine();
machine.produce();
} else if (type.equals("shoelace")) {
Machine machine = new ShoelaceMachine();
machine.produce();
} else {
// do others
}
}
}
也就是说,如果需要鞋子,我们就去生产一双鞋子,如果我们需要鞋带了,我们就去生产一双鞋带。乍眼一看,没什么不好的哇,需要什么,自己去造就好了嘛。可是如果我们需要的东西很多呢?那我们的家里是不是就要挤满了呢?不信你把那个else一直写下去试试,每一个需要生产的人家都来一遍这样的操作,代码冗余度岂不是很大?显然,鞋子和鞋带是大家都需要的东西吗?给他们建个工厂好不好,如果我们需要的话,我们直接去工厂里面拿,会不会更方便呢?一起来建个大工厂,共同搞事业喽。。。
public class ShoeFactory {
Machine machine = null;
public static Machine getMachine(String type) {
if (type.equals("shoe")) {
return new ShoeMachine();
} else if (type.equals("shoelace")) {
return new ShoelaceMachine();
} else {
// do others
return null;
}
}
}
接下里,如果我们想要双鞋子呢?直接开口问工厂要喽。。
public class Main {
public static void main(String[] args) {
String type = "shoe";
Machine machine = ShoeFactory.getMachine(type);
machine.produce();
}
}
其实,工厂模式在java编程中是很常见的,比如我们常见的连接数据库的操作,常见的数据库有mysql、redis、oracle等,如果都让我们自己连接,我们是不是会针对每一个连接都建立一个connectionManager?哈哈。。或许你已经猜到了,这部分工作可以由JDBC来帮我们做,JDBC就类似于一个连接的工厂。所以,我们最终看到的一种情形就是在配置文件中配置
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
然后,jdbc就会根据入参的不同,自动为我们加载所需要的驱动器。
那么,问题来了,我们什么时候可以使用工厂模式呢?
答案是没人能说得清楚,但是,如果你能预感到某种方法可能会因为某个参数(比如本例中type)的变化而不断的扩展,而且,这个方法在其他地方也会用到。也就是说,工厂生产的东西种类是会不断增加的,而这些东西大家都需要,那么我们便可以尝试使用工厂模式。