介绍
工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
举个例子:你想要造一辆汽车,可以直接告诉工厂制造,然后去取车即可,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现。
类图说明
图中用了一个车工厂造车的例子来画的一个类图,首先定义一个Car接口,该接口定义两个方法,一个getName()方法,另一个getColor()方法,分别定义三个车的种类,宝马,奔驰,特斯拉去实现它。然后再定义一个造车的工厂,你告诉车工厂要造什么车,通过方法参数告诉它,那它就造什么车给你,所以对应到前面咱们举的例子,这个就是工厂要做的事情,帮我们封装好了造车是怎么实现出来的,而我们如果想要造车,造什么样的车,通过FactoryPattern的main方法调用工厂类造对应的种类车即可。
代码示例
接下来咱们看下具体的代码示例:
public interface Car {
void getName();
void getColor();
}
public class BMW implements Car{
@Override
public void getName() {
System.out.println("我是宝马");
}
@Override
public void getColor() {
System.out.println("我是黑色车");
}
}
public class Benz implements Car{
@Override
public void getName() {
System.out.println("我是奔驰");
}
@Override
public void getColor() {
System.out.println("我是绿色车");
}
}
public class CarFactory {
public static <T extends Car> T createCar(Class<T> c){
Car car = null;
try {
car = (Car) Class.forName(c.getName()).newInstance();
} catch (Exception e) {
System.out.println("造车失败");
}
return (T)car;
}
}
public class FactoryPattern {
public static void main(String[] args){
BMW bmw = CarFactory.createCar(BMW.class);
bmw.getName();
bmw.getColor();
}
}
造着类图敲一遍进一步加深对工厂模式的理解。
应用场景
- 日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。
- 数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。
- 设计一个连接服务器的框架,需要三个协议,“POP3”、“IMAP”、“HTTP”,可以把这三个作为产品类,共同实现一个接口。
优缺点
优点
- 一个调用者想创建一个对象,只要知道其名称就可以了。
- 扩展性高,如果想增加一个产品,只要扩展一个产品类就可以。
- 屏蔽产品的具体实现,调用者只关心产品的接口
缺点
每次增加一个产品时,都需要增加一个具体类,使得系统中类的个数大大增加,在一定程度上增加了系统的复杂度。
拓展
以上例子通过一个工厂同时造宝马车,奔驰车,特斯拉,在现实生活中是不太现实的,那么我们可以将不同车的种类都各自拓展升级不同的工厂类出来,另外顺便提一下可以替代单例模式,也就是说一个单例类不再自行实例化,交给工厂类提供反射的方法实例化,且保证每次实例化都是同一个对象即可。
这里拿一个《设计模式之禅》里的例子看一下: