
一、介绍
工厂模式(Factory Pattern)是最常使用的设计模式之一,属于创建型设计模式 。在该设计模式中,我们不再使用new来实例化对象,而是通过工厂对象 来获取指定的对象实例,其中对象的实例化过程是在工厂中完成的。换句话说,就是将对象的实例化过程从 调用方控制 改变成 工厂控制
大家回忆一下spring框架的IOC容器:spring的IOC容器主要使用的设计模式之一就是工厂模式,它将我们对对象的控制权转移给了BeanFactory,BeanFactory把实例化的对象放在单例池(即容器)中,当我们需要从spring中获取一个对象时,spring直接从该容器中获取对应的实例并返回给我们。
工厂模式分为 简单工厂 静态工厂 工厂方法 抽象工厂。
我们先来一个简单静态工厂的案例,因为比较简单直接看代码。
java
public class CarFactory {
// 简单静态工厂
public static Car getCar(String carName) {
if ("保时捷".equals(carName)) {
return new Porsche();
} else if ("兰博基尼".equals(carName)) {
return new Lamborghini() ;
}else {
return null ;
}
}
}
测试类
java
public class Test {
public static void main(String[] args) {
Car porsche = CarFactory.getCar("保时捷");
porsche.getName();
}
}
根据不同汽车名称创建不同的汽车

上面的类CarFactory 里面给出了保时捷和兰博基尼2个汽车品牌,如果要生成第三种品牌的汽车就要修改CarFactory 里面的代码 实际上是违背设计原则的开闭原则的。
所以引入了工厂方法模式
今天主要介绍工厂方法模式
二、基本组件
- 工厂抽象。接口或抽象类,定义了工厂的行为。
- 工厂实现类。对工厂的行为提供了具体实现。不同的工厂实现类用于创建不同的产品实现类。
- 产品抽象。作为父类或接口,规定了一类具有相同行为的产品。
- 产品实现类。产品抽象类的具体实现。
一般来讲,从工厂中获取的对象类型为抽象类型,其具体类型由工厂方法决定。

三、案例应用
我们将上面CarFactory 进行再次抽象,然后又2个汽车工厂兰博基尼工厂(LamborghiniFactory)和保时捷工厂(PorscheFactory) 分别生产保时捷(Porsche)和兰博基尼(Lamborghini)

1. 代码演示
下面我们通过代码模拟工厂模式的实现
- 汽车工厂
java
public interface CarFactory {
Car getCar();
}
- 兰博基尼工厂
java
public class LamborghiniFactory implements CarFactory{
@Override
public Car getCar() {
return new Lamborghini();
}
}
- 保时捷工厂
java
public class PorscheFactory implements CarFactory {
@Override
public Car getCar() {
return new Porsche();
}
}
- 车子类
java
public interface Car {
void getName();
}
- 保时捷
java
public class Porsche implements Car {
@Override
public void getName() {
System.out.println("保时捷汽车");
}
}
- 兰博基尼
java
public class Lamborghini implements Car {
@Override
public void getName() {
System.out.println("兰博基尼汽车");
}
}
演示:

2. 优缺点
优点:
对象的创建过程与使用过程被解耦。如果被创建的对象结构复杂,则可以在工厂方法中完成该对象结构的组装。
工厂方法返回的是产品抽象。因此我们无需关注产品细节,只需要按照产品抽象所定义的方法进行方法调用即可。
当产品的创建过程需要修改时,我们只需在工厂方法中对创建逻辑进行修改即可,无需修改调用方的代码。
适用于结构复杂的对象的创建场景。
缺点:
虽然我们不再关注对象的创建过程,但是代价是需要关注工厂实例的创建过程。其实无论从代码层面还是现实层面来说,工厂对象一般只有一个,我们需要结合单例模式来处理对象工厂的创建和获取逻辑。
一个工厂对象仅能创建一种产品。
每当新增一个产品时,同样也需要创建对应的工厂类。这会导致项目中积累大量的工厂类和产品类。
不适用于简单对象的创建。原本只需一行代码就能完成,而使用工厂模式就需要创建工厂类、工厂方法等,增加代码量