抽象工厂模式是一种面向对象设计模式,用于创建具有相关性的对象家族。这个家族的产品通常都是具有共同接口的对象。在 Java 中,抽象工厂模式可以使用接口或抽象类来实现。
1. 模式结构
抽象工厂模式包含以下角色:
抽象工厂:定义用于创建产品家族的接口。
具体工厂:实现抽象工厂接口,用于创建具体的产品对象。
抽象产品:定义产品接口。
具体产品:实现抽象产品接口,提供具体的产品实例。
2. 模式示例
假设有一个餐厅需要提供中式和西式菜品,需要使用抽象工厂模式来实现。首先,我们需要定义饭店工厂的接口(即抽象工厂):
```
public interface RestaurantFactory {
public Food getFood();
public Drink getDrink();
}
```
其中,`getFood()` 和 `getDrink()` 方法用于获取菜品和饮品。
然后,我们需要定义具体的工厂类,即中式餐厅工厂和西式餐厅工厂:
```
public class ChineseRestaurantFactory implements RestaurantFactory {
public Food getFood() {
return new ChineseFood();
}
public Drink getDrink() {
return new ChineseDrink();
}
}
public class WesternRestaurantFactory implements RestaurantFactory {
public Food getFood() {
return new WesternFood();
}
public Drink getDrink() {
return new WesternDrink();
}
}
```
在具体工厂类中,我们可以根据需要创建具体的产品,即中式菜品和饮品或西式菜品和饮品。
最后,我们需要定义抽象产品和具体产品:
```
public interface Food {
public String getDescription();
}
public class ChineseFood implements Food {
public String getDescription() {
return "中式菜品";
}
}
public class WesternFood implements Food {
public String getDescription() {
return "西式菜品";
}
}
public interface Drink {
public String getDescription();
}
public class ChineseDrink implements Drink {
public String getDescription() {
return "中式饮品";
}
}
public class WesternDrink implements Drink {
public String getDescription() {
return "西式饮品";
}
}
```
这样,我们就可以通过中式餐厅工厂或西式餐厅工厂来获取具体的菜品和饮品。
3. 模式优缺点
优点:
1. 抽象工厂模式可以保证产品家族的一致性,即所创建的产品都是同一类别的,符合设计要求。
2. 抽象工厂模式可以分离产品的创建和使用,使客户端和工厂类分离,降低了客户端的耦合度。
3. 抽象工厂模式可以添加新的产品家族,无需修改已有代码,符合开放封闭原则。
缺点:
1. 抽象工厂模式的扩展性较差,添加新的产品需要修改抽象工厂接口及其所有实现类。
2. 抽象工厂模式针对每个产品家族都需要提供一个工厂类,如果产品家族较多,将会产生很多具体工厂类,导致系统复杂度增加。
4. 模式适用场景
1. 系统需要一个产品族,而其中的产品的实现类有多个,例如不同品牌的电视机、手机等。
2. 系统不依赖于产品的创建细节和实现过程,即只需要知道产品的接口,例如旅游系统中的吃饭和住宿模块。
3. 系统需要扩展当前的产品族,例如添加新的餐厅菜品。
扫码咨询 领取资料