设计模式——抽象工厂
抽象工厂:将单个相关或者依赖的工厂组合在一起,而不指定他们具体类的工厂
举例:创建一个王国,我们需要具体的对象。精灵王国需要精灵国王、精灵城堡和精灵军队,而兽人王国需要兽人国王、兽人城堡和兽人军队。王国中的对象之间存在依赖关系。
城堡接口:
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);
}