java常用设计模式-简单工厂模式原创
在现实生活中,其实我们可以看到很多的工厂,大大小小的,从最最简单的的造酒厂到大型的代加工的富士康,这个其实就是工厂的演变以及进化。于是乎在我们Java世界里,其实工厂模式也可以进化演变。老猫研究了一段时间,并且总结分享给大家。
进化的流程大致是这样的:
简单工厂模式->工厂方法模式->抽象工厂模式。接下来,跟着老猫一个一个往下看,在此期间,老猫会举一些例子,供大家参考。
# 简单工厂模式
在说明简单工厂模式之前,我们先举个例子,就拿造酒来说吧。一家酒厂可以酿造各种不同的酒,例如米酒,黄酒,白酒等。无论如何这个工厂也只能够具备造酒这一种职能。对照着这个例子,我们就能给简单工厂模式下个简单的定义。简单工厂模式是指由一个工厂对象决定创建某一种产品类型的实例。
下面我们对照着实际的Java代码来进行举例。
首先我们有一个酒厂这个接口,如下:
//造酒厂接口
public interface IDistillery {
/**造酒**/
void makeWine();
}
2
3
4
5
再创建两个实现酒厂接口的黄酒以及白酒的实际制造铺,如下:
/**白酒酿酒铺*/
public class WhiteWineDistillery implements IDistillery{
public void makeWine() {
System.out.println("酿造白酒");
}
}
2
3
4
5
6
/**黄酒酿造铺**/
public class YelloWineDistillery implements IDistillery{
public void makeWine() {
System.out.println("酿造黄酒");
}
}
2
3
4
5
6
以上我们就创建了两个酿造铺用来造酒,那么我们如何将这样的一个酿酒作坊运转起来呢?这时候我们要将这些造酒小铺组装到一起成为一个工厂。
public class SimpleWineFactory {
public IDistillery create(String name){
if("white".equals(name)){
return new WhiteWineDistillery();
}else if("yellow".equals(name)){
return new YelloWineDistillery();
}
return null;
}
}
2
3
4
5
6
7
8
9
10
我们调用起来创建对象的时候就非常简单了,如下main函数:
public class WineMain {
public static void main(String[] args) {
SimpleWineFactory swf = new SimpleWineFactory();
//创建了黄酒厂
swf.create("yellow");
}
}
2
3
4
5
6
7
以上就是一个最最乞丐版本的工厂模式。其中有哪个地方不足,我想,大家应该可以看出来。在以上的代码里面,其实这个工厂我们每次有一种新的酒出来的话,我们就要去修改这个工厂方法。参照软件的设计原则是不符合里面的开闭原则。其实我们完全可以通过之前介绍的反射技术对其进行优化。
我们来看一下经过改造之后工厂方法:
public class SimpleWineFactory {
public IDistillery create(Class<? extends IDistillery> clazz){
if(null != clazz){
try {
return clazz.getDeclaredConstructor().newInstance();
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
}
2
3
4
5
6
7
8
9
10
11
12
通过这样改造之后,我们可以进行这样的调用就会优雅很多,如下:
public class WineMain {
public static void main(String[] args) {
SimpleWineFactory swf = new SimpleWineFactory();
//创建白酒
swf.create(WhiteWineDistillery.class).makeWine();
}
}
2
3
4
5
6
7
以上就是我们的简单工厂模式,该工厂模式其缺点是:工厂类的职责相对过重,不易于扩展过于复杂的产品结构。在我们的实际JDK的源码中,其实也会有很多这样的应用,例如Calendar类,还有logback中的LoggerFactory,如果有兴趣的话,大家可以自行去看一下这些源码,我想肯定有所收获。