设计模式之抽象工厂模式

概念

抽象工厂模式(Abstract Factory),提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类

优点

  • 灵活性: 无需修改代码即可在产品系列之间轻松切换
  • 解耦: 客户端代码只与抽象接口交互,提高了可移植性和可维护性
  • 可重用性: 抽象工厂和产品促进了跨项目的组件重用
  • 可维护性: 对单个产品系列的更改是本地化的,简化了更新

什么时候使用抽象工厂模式

  • 系统应该独立于其产品的创建、组合和表示方式
  • 需要使用多个产品系列中的一个来配置系统
  • 一系列相关的产品对象必须一起使用,以保持一致性
  • 希望提供的产品的类库,只公开它们的接口,而不是它们的实现
  • 依赖项的生存期比使用者的生存期短
  • 需要使用运行时的值或参数构造依赖项
  • 需要在运行时从一系列产品中选择使用哪个产品
  • 添加新产品或系列不应要求对现有代码进行更改

示例

创建精灵王国和半兽人王国

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public interface Castle {
String getDescription();
}

public interface King {
String getDescription();
}

public interface Army {
String getDescription();
}

// Elven implementations ->
public class ElfCastle implements Castle {
static final String DESCRIPTION = "This is the elven castle!";

@Override
public String getDescription() {
return DESCRIPTION;
}
}

public class ElfKing implements King {
static final String DESCRIPTION = "This is the elven king!";

@Override
public String getDescription() {
return DESCRIPTION;
}
}

public class ElfArmy implements Army {
static final String DESCRIPTION = "This is the elven Army!";

@Override
public String getDescription() {
return DESCRIPTION;
}
}

// Orcish implementations similarly -> ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public interface KingdomFactory {
Castle createCastle();

King createKing();

Army createArmy();
}

public class ElfKingdomFactory implements KingdomFactory {

@Override
public Castle createCastle() {
return new ElfCastle();
}

@Override
public King createKing() {
return new ElfKing();
}

@Override
public Army createArmy() {
return new ElfArmy();
}
}

// Orcish implementations similarly -> ...
1
2
3
4
5
6
7
8
9
10
11
12
13
public static class FactoryMaker {

public enum KingdomType {
ELF, ORC
}

public static KingdomFactory makeFactory(KingdomType type) {
return switch (type) {
case ELF -> new ElfKingdomFactory();
case ORC -> new OrcKingdomFactory();
};
}
}

注意事项

  • 复杂性: 定义抽象接口和具体工厂会增加初始开销
  • 间接性: 客户端代码通过工厂间接地与产品交互,这可能会降低透明度

设计模式之抽象工厂模式
http://s1mplecode.com/design-pattern/abstract-factory.html
作者
Jago
发布于
2024年12月25日
许可协议