设计模式——抽象工厂

122 阅读1分钟

设计模式——抽象工厂

抽象工厂:将单个相关或者依赖的工厂组合在一起,而不指定他们具体类的工厂

举例:创建一个王国,我们需要具体的对象。精灵王国需要精灵国王、精灵城堡和精灵军队,而兽人王国需要兽人国王、兽人城堡和兽人军队。王国中的对象之间存在依赖关系。

城堡接口:

public interface Castle {
  String getDescription();
}

国王接口:

public interface King {
  String getName();
}

军队接口:

public interface Army {
  String getArmyName();
}

精灵城堡:

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 NAME = "Rosa";
  @Override
  public String getName() {
    return NAME;
  }
}

精灵军队:

public class ElfArmy implements Army {
  static final String NAME = "Three";
  @Override
  public String getArmyName() {
    return NAME;
  }
}

工厂:

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();
  }
}

兽人王国工厂:

public class OrcKingdomFactory implements KingdomFactory {

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

  @Override
  public King createKing() {
    return new OrcKing();
  }
  
  @Override
  public Army createArmy() {
    return new OrcArmy();
  }
}

使用:

KingdomFactory factory = new ElfKingdomFactory();
Castle castle = factory.createCastle();
King king = factory.createKing();
Army army = factory.createArmy();

返回Factory

public static class FactoryMaker {

  public enum KingdomType {
    ELF, ORC
  }

  public static KingdomFactory makeFactory(KingdomType type) {
    switch (type) {
      case ELF:
        return new ElfKingdomFactory();
      case ORC:
        return new OrcKingdomFactory();
      default:
        throw new IllegalArgumentException("KingdomType not supported.");
    }
  }
}

使用:

public static void main(String[] args) {
  var app = new App();
  FactoryMaker.makeFactory(KingdomType.ELF);
  FactoryMaker.makeFactory(KingdomType.ORC);
}