《设计模式》第三篇:工厂模式
本期内容为自己总结归档,共分6章,本人遇到过的面试问题会重点标记。
《设计模式》第一篇:初识
《设计模式》第二篇:单例模式
《设计模式》第三篇:工厂模式
《设计模式》第四篇:观察模式
《设计模式》第五篇:策略模式
《设计模式》第六篇:装饰器模式
《设计模式》第七篇:适配器模式
《设计模式》第八篇:创建型模式
《设计模式》第九篇:结构型模式
《设计模式》第十篇:行为型模式
《设计模式》第十一篇:总结&常用案例
(若有任何疑问,可在评论区告诉我,看到就回复)
一、工厂模式的核心思想
1.1 为什么需要工厂模式?
在软件设计中,对象的创建往往比使用更复杂,原因包括:
-
创建逻辑复杂:对象创建可能涉及复杂的初始化过程
-
依赖环境:需要根据配置、运行时环境决定创建哪种对象
-
需要统一管理:某些对象的创建需要统一控制
-
需要解耦:避免创建逻辑污染业务代码
工厂模式的核心理念是:封装变化点。将对象创建这个变化点封装起来,让客户端代码保持稳定。
1.2 工厂模式的演化路径
工厂模式不是单一模式,而是一个模式家族

二、简单工厂模式
专门定义一个类来负责创建其他类的实例,根据参数的不同创建不同类的实例,被创建的实例通常都具有共同的父类。这个模式叫简单工厂模式(SimpleFactory),又称为静态工厂方法模式
2.1、优缺点
简单工厂的优点
-
抽象出一个专门的类来负责某类对象的创建,分割出创建的职责,不能直接去创建具体的对象,只要传入适当的参数即可。
-
使用者可以不用关注具体对象的类名称,只知道传入什么参数可以创建哪些需要的对象。
-
实现简单、结构浅析
简单工厂的缺点
-
如果产品的种类非常多,createProduct 方法会变得非常庞大,switch … case …(或 if … else …)的判断会变得非常多。
-
不符合开放—封闭原则(对拓展开放,对修改封闭),如果要增加或删除一个产品种类,就要修改 switch … case …(或 if … else …)的判断代码。
2.2、代码示例
// 产品接口
public interface Button {
void render();
}
// 具体产品
public class WindowsButton implements Button {
@Override
public void render() {
System.out.println("渲染Windows风格的按钮");
}
}
// 简单工厂
public class ButtonFactory {
public static Button createButton(String osType) {
if ("windows".equals(osType)) {
return new WindowsButton();
} else if ("macos".equals(osType)) {
return new MacOSButton();
}
throw new IllegalArgumentException("不支持的OS类型");
}
}
三、工厂方法模式
工厂方法模式是简单工厂模式的一个升级版本,为解决简单工厂模式中不符合开放-封闭原则的问题,我们对 SimpleFactory 进行了一个拆分,抽象出一个父类 Factory,并增加多个子类分别负责创建不同的具体产品。
3.1、优缺点
优点:
-
解决了简单工厂模式中不符合 开放—封闭原则 的问题,使程序更容易拓展。
-
实现简单,因为工厂方法模式简单且易于拓展,因此在项目中应用的非常广泛,在很多标准库和开源项目中都能看到他的影子。
缺点:
-
对于有多种分类的产品,或具有二级分类的产品,工厂方法模式并不适用。(如果二级子类当作一级处理,会造成子类超级多)
3.2、代码示例
// 产品接口
public interface Logger {
void log(String message);
}
// 具体产品
public class FileLogger implements Logger {
@Override
public void log(String message) {
System.out.println("写入文件: " + message);
}
}
// 抽象工厂
public abstract class LoggerFactory {
public abstract Logger createLogger();
}
// 具体工厂
public class FileLoggerFactory extends LoggerFactory {
@Override
public Logger createLogger() {
return new FileLogger();
}
}
四、抽象工厂模式
抽象工厂模式又是工厂方法模式的升级版本,工厂方法模式不能解决具有二级分类的产品的创建,抽象工厂模式就是用来解决这一缺陷的。
工厂下有两个产品线,分为一级能源消耗、二级能源消耗。每个产品线都可以生产产品A和B。这种情况下,使用抽象工厂模式。
4.1、优缺点
优点:
-
解决了具有二级分类的产品的创建。
缺点:
-
如果产品的分类超过二级,如三级甚至更多的级,抽象工厂模式将会变得非常臃肿。
-
不能解决产品有多种分类多种组合的问题。
注意: 如果产品出现三级甚至更多级的分类怎么办?
答:优化业务逻辑,结合其他模式一起使用。例如工厂+中介
4.2、代码示例
// 抽象产品接口
public interface Button {
void render();
}
public interface TextBox {
void render();
}
// 抽象工厂
public interface GUIFactory {
Button createButton();
TextBox createTextBox();
}
// 具体工厂
public class WindowsFactory implements GUIFactory {
@Override
public Button createButton() {
return new WindowsButton();
}
@Override
public TextBox createTextBox() {
return new WindowsTextBox();
}
}
// 客户端
public class Application {
private GUIFactory factory;
public Application(GUIFactory factory) {
this.factory = factory;
}
public void renderUI() {
Button button = factory.createButton();
TextBox textBox = factory.createTextBox();
button.render();
textBox.render();
}
}
五、工厂模式在Spring框架中的应用
5.1 BeanFactory:Spring的核心工厂
BeanFactory是Spring IoC容器的核心接口,本质上是抽象工厂模式:
// BeanFactory接口定义(简化)
public interface BeanFactory {
Object getBean(String name);
T getBean(Class requiredType);
}
// ApplicationContext是增强版
public interface ApplicationContext extends BeanFactory {
// 更多企业级功能
}
5.2 FactoryBean:特殊的Bean创建逻辑
FactoryBean是一个特殊的Bean,用于自定义复杂对象的创建逻辑:
public interface FactoryBean {
T getObject() throws Exception;
Class> getObjectType();
boolean isSingleton();
}
// 示例:创建复杂对象
@Component
public class ComplexObjectFactoryBean implements FactoryBean {
@Override
public ComplexObject getObject() throws Exception {
// 复杂的创建逻辑
ComplexObject obj = new ComplexObject();
obj.initialize();
return obj;
}
@Override
public Class> getObjectType() {
return ComplexObject.class;
}
}
关键点:
-
FactoryBean本身是一个Bean,由BeanFactory管理
-
当需要获取FactoryBean生产的对象时,Spring会调用getObject()方法
-
这种机制适合创建需要复杂初始化的对象
5.3 Spring中的工厂方法模式
Spring支持通过静态工厂方法和实例工厂方法创建Bean:
// XML配置方式
// 注解配置方式
@Configuration
public class AppConfig {
@Bean
public Service service() {
return ServiceFactory.createService();
}
}
总结
工厂模式是创建型设计模式中最常用的模式之一:
模式演进:
简单工厂 → 工厂方法 → 抽象工厂
逐步抽象,逐步符合设计原则
核心价值:
封装变化,分离关注点
提高代码的可维护性和扩展性
实际应用:
Spring框架的核心机制
JDK中的广泛应用
连接池、缓存等基础设施
最佳实践:
根据场景选择合适模式
避免过度设计
记住:工厂模式是工具,不是目标。目标是写出清晰、可维护、可扩展的代码。









