本文最后更新于 2024-12-25T22:02:25+08:00
概念
抽象工厂模式(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(); }
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; } }
|
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(); } }
|
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