
工厂设计模式(Factory Pattern)是最常用的设计模式之一,属于创建型模式。其核心思想是通过引入一个工厂类来实例化对象,而不是直接在客户端代码中使用 new 关键字来创建对象。这种方式能够将对象的创建过程封装起来,使得代码更加灵活、可扩展、易于维护。
工厂模式主要适用于以下场景:
工厂设计模式包括以下几种类型,每种模式的适用场景略有不同:
简单工厂模式是最基础的工厂模式,其核心思想是通过一个工厂类来决定创建哪种类型的产品对象。客户端并不直接实例化产品类,而是通过工厂类来获得实例。
简单工厂模式的时序图如下所示:

下面我们围绕这个时序图来讲解
假设我们有两种类型的产品,ConcreteProductA 和 ConcreteProductB,我们需要根据客户端的需求动态创建相应的产品对象。
// 产品接口
public interface Product {
void operation(); //具体实现
}
// 具体产品A
public class ConcreteProductA implements Product {
@Override
public void operation() {
System.out.println("ConcreteProductA operation"); //对产品A不同的实现
}
}
// 具体产品B
public class ConcreteProductB implements Product {
@Override
public void operation() {
System.out.println("ConcreteProductB operation");//对产品B不同的实现
}
}
// 简单工厂类
public class SimpleFactory {
/**
* 根据不同的type执行我们不同的产品类型
*/
public static Product createProduct(String type) {
if ("productA".equalsIgnoreCase(type)) {
return new ConcreteProductA();
} else if ("productB".equalsIgnoreCase(type)) {
return new ConcreteProductB();
} else {
throw new IllegalArgumentException("Unknown product type");
}
}
}
// 调用代码
public class Client {
public static void main(String[] args) {
Product productA = SimpleFactory.createProduct("A");
productA.operation(); // 输出:ConcreteProductA operation
Product productB = SimpleFactory.createProduct("B");
productB.operation(); // 输出:ConcreteProductB operation
}
}
//定义枚举方便维护
public enum ProductType{
productA,
productB //枚举中定义产品类型
}优点:
缺点:

工厂方法模式通过定义一个创建对象的接口,但由子类来决定实例化哪个类。这种模式通过子类来具体化创建产品的方式,使得创建过程更加灵活。客户端代码不需要依赖具体的类,而是依赖于工厂接口来创建产品。
工厂方法模式的时序图图如下:

在工厂方法模式中,我们定义一个抽象工厂接口,并在子类中实现具体的产品创建方法。
// 产品接口
public interface Product {
void operation();
}
// 具体产品A
public class ConcreteProductA implements Product {
@Override
public void operation() {
System.out.println("ConcreteProductA operation");
}
}
// 具体产品B
public class ConcreteProductB implements Product {
@Override
public void operation() {
System.out.println("ConcreteProductB operation");
}
}
// 抽象工厂类
public interface Creator {
Product factoryMethod();
}
// 具体工厂A
public class ConcreteCreatorA implements Creator {
@Override
public Product factoryMethod() {
return new ConcreteProductA();
}
}
// 具体工厂B
public class ConcreteCreatorB implements Creator {
@Override
public Product factoryMethod() {
return new ConcreteProductB();
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
Creator creatorA = new ConcreteCreatorA();
Product productA = creatorA.factoryMethod();
productA.operation(); // 输出:ConcreteProductA operation
Creator creatorB = new ConcreteCreatorB();
Product productB = creatorB.factoryMethod();
productB.operation(); // 输出:ConcreteProductB operation
}
}优点:
缺点:
抽象工厂模式是工厂模式的一种扩展,它不仅创建单一产品,还可以创建一系列相关的产品对象。抽象工厂提供了一个接口,允许客户端创建一组产品对象,而无需指定它们具体的类。这样可以确保一组产品对象在同一工厂下被创建。
抽象工厂模式的时序图图如下:

// 产品A接口
public interface ProductA {
void operationA();
}
// 产品B接口
public interface ProductB {
void operationB();
}
// 具体产品A1
public class ConcreteProductA1 implements ProductA {
@Override
public void operationA() {
System.out.println("ConcreteProductA1 operationA");
}
}
// 具体产品A2
public class ConcreteProductA2 implements ProductA {
@Override
public void operationA() {
System.out.println("ConcreteProductA2 operationA");
}
}
// 具体产品B1
public class ConcreteProductB1 implements ProductB {
@Override
public void operationB() {
System.out.println("ConcreteProductB1 operationB");
}
}
// 具体产品B2
public class ConcreteProductB2 implements ProductB {
@Override
public void operationB() {
System.out.println("ConcreteProductB2 operationB");
}
}
// 抽象工厂
public interface AbstractFactory {
ProductA createProductA();
ProductB createProductB();
}
// 具体工厂1
public class ConcreteFactory1 implements AbstractFactory {
@Override
public ProductA createProductA() {
return new ConcreteProductA1();
}
@Override
public ProductB createProductB() {
return new ConcreteProductB1();
}
}
// 具体工厂2
public class ConcreteFactory2 implements AbstractFactory {
@Override
public ProductA createProductA() {
return new ConcreteProductA2();
}
@Override
public ProductB createProductB() {
return new ConcreteProductB2();
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
AbstractFactory factory1 = new ConcreteFactory1();
ProductA productA1 = factory1.createProductA();
productA1.operationA(); // 输出:ConcreteProductA1 operationA
ProductB productB1 = factory1.createProductB();
productB1.operationB(); // 输出:ConcreteProductB1 operationB
AbstractFactory factory2 = new ConcreteFactory2();
ProductA productA2 = factory2.createProductA();
productA2.operationA(); // 输出:ConcreteProductA2 operationA
ProductB productB2 = factory2.createProductB();
productB2.operationB(); // 输出:ConcreteProductB2 operationB
}
}优点:
缺点:
根据实际需求选择不同的工厂模式,能够提高系统的灵活性、可扩展性和可维护性。不同的工厂模式适用于不同的场景,简单工厂适合少量产品,工厂方法和抽象工厂适合产品种类多且需要灵活扩展的情况。