题目
介绍下工厂模式
解释
简单工厂模式、工厂方法模式、抽象工厂模式
答案
工厂模式提供了一种创建对象的方式,而无需指定要创建的具体类。
通过使用工厂模式,可以将对象的创建逻辑封装在一个工厂类中,而不是在客户端代码中直接实例化对象,这样可以提高代码的可维护性和可扩展性。
## 工厂模式的类型
### 简单工厂模式(Simple Factory Pattern)
简单工厂模式不是一个正式的设计模式,但它是工厂模式的基础。它使用一个单独的工厂类来创建不同的对象,根据传入的参数决定创建哪种类型的对象,客户端无需关注具体类名。
工厂类集中管理对象的创建逻辑,但新增产品需修改工厂类代码,违反开闭原则。
代码示例:
```java
// 抽象产品接口
interface Device {
void start();
}
// 具体产品类
class Phone implements Device {
@Override
public void start() { System.out.println("手机开机"); }
}
class Tablet implements Device {
@Override
public void start() { System.out.println("平板开机"); }
}
// 简单工厂类
class SimpleDeviceFactory {
public static Device createDevice(String type) {
if ("phone".equals(type)) {
return new Phone();
} else if ("tablet".equals(type)) {
return new Tablet();
}
throw new IllegalArgumentException("未知设备类型");
}
}
// 客户端使用
public class Client {
public static void main(String[] args) {
Device device = SimpleDeviceFactory.createDevice("phone");
device.start(); // 输出:手机开机
}
}
```
### 工厂方法模式(Factory Method Pattern)
工厂方法模式定义了一个创建对象的接口,但由子类决定实例化哪个类。工厂方法将对象的创建延迟到子类。每个产品对应一个工厂类,符合开闭原则,但类数量增加
代码示例:
```java
// 抽象产品接口
interface LoginService {
boolean login(String username, String credential);
}
// 具体产品类
class UserLoginService implements LoginService {
@Override
public boolean login(String username, String password) {
System.out.println("普通用户登录验证");
return "user".equals(username) && "123".equals(password);
}
}
// 抽象工厂接口
interface LoginFactory {
LoginService createLoginService();
}
// 具体工厂类
class UserLoginFactory implements LoginFactory {
@Override
public LoginService createLoginService() {
return new UserLoginService();
}
}
// 客户端使用
public class Client {
public static void main(String[] args) {
LoginFactory factory = new UserLoginFactory();
LoginService service = factory.createLoginService();
service.login("user", "123");
}
}
```
### 抽象工厂模式(Abstract Factory Pattern)
抽象工厂模式提供接口创建多个相关产品族(如Apple全家桶:手机+充电器),确保产品兼容性。适用于需要统一产品族的场景,但新增产品种类困难
代码示例:
```java
// 抽象产品族
interface Phone {
void use();
}
interface Charger {
void charge();
}
// Apple产品族
class iPhone implements Phone {
@Override
public void use() { System.out.println("使用iPhone"); }
}
class AppleCharger implements Charger {
@Override
public void charge() { System.out.println("Apple充电器工作"); }
}
// 抽象工厂接口
interface TechFactory {
Phone createPhone();
Charger createCharger();
}
// 具体工厂类
class AppleFactory implements TechFactory {
@Override
public Phone createPhone() { return new iPhone(); }
@Override
public Charger createCharger() { return new AppleCharger(); }
}
// 客户端使用
public class Client {
public static void main(String[] args) {
TechFactory factory = new AppleFactory();
Phone phone = factory.createPhone();
Charger charger = factory.createCharger();
phone.use();
charger.charge();
}
}
```
## 总结
- **简单工厂**:适用于产品少且变化不频繁的场景,快速实现但扩展性差
- **工厂方法**:适合需要灵活扩展单一产品的场景,如多品牌设备生产
- **抽象工厂**:用于管理多个相关产品族,如跨平台应用开发
