### 深入浅出设计模式之工厂模式详解
#### 引言
设计模式是软件工程领域中的一个重要概念,它们是一系列被广泛接受的解决特定问题的方法论。设计模式不仅能够帮助开发人员编写出结构良好、易于维护的代码,还能促进团队间的交流与合作。在众多的设计模式中,“工厂模式”因其简洁性和灵活性而被广泛应用。
#### 工厂模式概述
工厂模式是一种常用的创建型设计模式,它的核心思想是定义一个创建一系列相关或相互依赖对象的接口,而无需指定具体的类。这样做的目的是为了将创建对象的过程与使用对象的过程解耦,提高系统的灵活性和可扩展性。
根据《Java与模式》一书,工厂模式主要可以分为以下几种:
1. **简单工厂模式**(Simple Factory)
2. **工厂方法模式**(Factory Method)
3. **抽象工厂模式**(Abstract Factory)
这三种模式从简单到复杂逐步抽象,每种模式都有其适用场景。
#### 一、简单工厂模式详解
**简单工厂模式**,又称为**静态工厂方法模式**,是最简单的工厂模式之一。它主要用于创建对象时需要进行一定的逻辑判断。简单工厂模式的构成包括:
1. **工厂类**(Factory Class):包含一定的商业逻辑和判断逻辑,负责创建具体的产品对象。
2. **抽象产品**(Product Interface):通常是具体产品继承的父类或实现的接口。
3. **具体产品**(Concrete Product):工厂类所创建的对象就是此类的实例。
#### 示例:简单工厂模式在汽车驾驶场景的应用
假设有一位富豪拥有多辆不同品牌的汽车,但每次乘坐汽车时都需要明确告诉司机驾驶哪一品牌的汽车。为了解决这一问题,我们可以采用简单工厂模式来改进该场景。
1. **抽象产品角色**:定义一个汽车接口`Car`,包含一个`drive()`方法。
```java
public interface Car {
public void drive();
}
```
2. **具体产品角色**:实现`Car`接口的不同品牌汽车类,例如`Benz`和`Bmw`。
```java
public class Benz implements Car {
public void drive() {
System.out.println("Driving Benz");
}
}
public class Bmw implements Car {
public void drive() {
System.out.println("Driving Bmw");
}
}
```
3. **工厂类角色**:实现一个`Driver`类作为工厂类,包含一个静态方法`driverCar(String s)`,根据输入的品牌字符串返回对应品牌的汽车对象。
```java
public class Driver {
public static Car driverCar(String s) throws Exception {
if (s.equalsIgnoreCase("Benz")) return new Benz();
else if (s.equalsIgnoreCase("Bmw")) return new Bmw();
// 其他品牌处理逻辑
else throw new Exception("Invalid car brand");
}
}
```
4. **客户端**:富豪只需告诉司机他今天想要乘坐哪个品牌的汽车,然后司机调用工厂类创建对应的汽车对象。
```java
public class Magnate {
public static void main(String[] args) {
try {
Car car = Driver.driverCar("benz"); // 或者 "bmw" 等
car.drive();
} catch (Exception e) {
e.printStackTrace();
}
}
}
```
#### 优点与局限性
- **优点**:使用简单工厂模式之后,程序更加符合实际情况,客户端不再直接创建产品对象,而是通过工厂类来完成。这使得代码更加清晰,易于维护。
- **局限性**:每当新增一个产品时,都需要在工厂类中添加新的判断逻辑。这种方式违反了开闭原则(对扩展开放,对修改关闭),即系统应该易于扩展,但不应该轻易修改现有代码。
#### 结语
简单工厂模式适用于需要创建的对象较少、变化不多的情况。随着系统需求的变化,可能会需要考虑更高级的工厂模式,如工厂方法模式或抽象工厂模式。简单工厂模式虽然简单易懂,但在大型项目中可能不是最佳选择,需要根据实际情况灵活选择设计模式。