Java面试题 - 请描述简单工厂模式的工作原理。
回答重点
简单工厂模式(SimpleFactoryPattern)不属于GoF23种经典设计模式之一,但是在实际开发中非常常见,它的作用是利用一个工厂作为入口,将多个对象的创建和使用分离。它根据传入的参数来创建并返回不同类型的对象实例。
来看下具体的代码实现就很清晰了:
// 产品接口
public interface Product {
void use();
}
// 具体产品A
public class ConcreteProductA implements Product {
@Override
public void use() {
System.out.println("Using ConcreteProductA");
}
}
// 具体产品B
public class ConcreteProductB implements Product {
@Override
public void use() {
System.out.println("Using ConcreteProductB");
}
}
// 简单工厂类
public class SimpleFactory {
public static Product createProduct(String type) {
switch (type) {
case "A":
return new ConcreteProductA();
case "B":
return new ConcreteProductB();
default:
throw new IllegalArgumentException("Unknown product type");
}
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
Product productA = SimpleFactory.createProduct("A");
productA.use(); // Output: Using ConcreteProductA
Product productB = SimpleFactory.createProduct("B");
productB.use(); // Output: Using ConcreteProductB
}
}
它的优点:
- 将对象的创建集中在工厂类中,便于管理和维护
- 屏蔽了底层的创建细节,对使用者来说更方便
缺点:
- 如果一个工厂类集中所有产品的创建逻辑,那么职责过重,不符合单一职责原则
- 新增一个产品类型,工厂类都需要被修改,不符合开闭原则
什么是简单工厂模式
简单工厂模式(Simple Factory Pattern)是一种创建型设计模式,它提供了一种创建对象的最佳方式。在简单工厂模式中,我们创建一个工厂类,它根据传入的参数决定创建并返回哪一种产品类的实例。
简单工厂模式并不是GoF(四人帮)定义的23种设计模式之一,但它作为一种编程习惯被广泛使用,是工厂模式家族中最简单的一种形式。
工作原理
简单工厂模式的核心思想是将对象的创建过程封装在一个工厂类中,客户端不需要知道具体的创建细节,只需要告诉工厂类需要什么类型的对象即可。
上面的类图展示了简单工厂模式的基本结构:
- Client(客户端): 使用工厂类创建产品对象
- Factory(工厂类): 负责创建具体产品对象的类
- Product(产品接口): 定义产品的公共接口
- ConcreteProduct(具体产品): 实现产品接口的具体类
工作流程
工作流程说明:
- 客户端向工厂类发送请求,附带创建参数
- 工厂类根据参数判断应该创建哪种产品
- 工厂类创建具体产品实例
- 工厂类将产品实例返回给客户端
- 客户端通过产品接口使用产品功能
代码示例
以下是一个简单的Java实现示例:
// 产品接口
interface Product {
void operation();
}
// 具体产品A
class ConcreteProductA implements Product {
@Override
public void operation() {
System.out.println("ConcreteProductA operation");
}
}
// 具体产品B
class ConcreteProductB implements Product {
@Override
public void operation() {
System.out.println("ConcreteProductB operation");
}
}
// 简单工厂
class SimpleFactory {
public static Product createProduct(String type) {
if ("A".equals(type)) {
return new ConcreteProductA();
} else if ("B".equals(type)) {
return new ConcreteProductB();
}
throw new IllegalArgumentException("Unknown product type");
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
Product productA = SimpleFactory.createProduct("A");
productA.operation();
Product productB = SimpleFactory.createProduct("B");
productB.operation();
}
}
优缺点分析
优点
- 封装创建逻辑:将对象的创建过程集中管理,客户端无需关心创建细节
- 解耦:客户端与具体产品类解耦,只依赖产品接口和工厂类
- 易于扩展:添加新产品只需修改工厂类,不需要修改客户端代码(符合开闭原则)
缺点
- 工厂类职责过重:所有产品创建逻辑集中在一个工厂类中
- 违反开闭原则:添加新产品需要修改工厂类代码
- 难以扩展复杂层次结构:不适合产品类层次复杂或需要定制化创建过程的场景
适用场景
简单工厂模式适用于以下场景:
- 需要创建的对象较少且不经常变化
- 客户端不关心对象的创建过程,只需要获取产品实例
- 需要集中管理对象的创建逻辑
- 作为其他更复杂工厂模式的基础
总结
简单工厂模式通过将对象的创建过程封装在一个专门的工厂类中,实现了创建逻辑与使用逻辑的分离。虽然它有一些局限性,但在适当的场景下,简单工厂模式能够有效地简化代码结构,提高系统的可维护性和灵活性。
当系统需要更灵活的对象创建机制时,可以考虑使用工厂方法模式或抽象工厂模式等更高级的创建型模式。