抽象工厂模式提供一个接口,让你可以在不指定具体类的情况下,创建一类有关联或依赖的对象。
例子:
一个王国都拥有自己的国王,城堡,和军队。 但是,精灵王国拥有的是精灵国王,精灵城堡,精灵军队;而兽人王国拥有的则是兽人国王,兽人城堡,兽人军队。
如何使用代码任意地创建精灵王国和兽人王国呢。
使用抽象工厂模式,将国王,城堡和军队抽象化,提供这三类事物的接口:
public interface King {
String getDescription();
}
public interface Castle {
String getDescription();
}
public interface Army {
String getDescription();
}
这三个接口下,都可以有任意个实现类,在当前例子中,则需要两个实现类,分别对应精灵和兽人,即精灵国王,兽人国王,精灵城堡,兽人城堡,精灵军队,兽人军队。
然后需要一个工厂类去创建一个精灵王国或者兽人王国。
分别是精灵王国工厂类和兽人王国工厂类。这样我们也可以抽象出一个“王国工厂”的接口:
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();
}
}
如此,通过不同的工厂类就可以创建不同的王国。
还可以使用工厂的工厂,在运行时,根据参数的不同来创建不同的工厂类:
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.");
}
}
}
通过一个枚举,代表创建不同的工厂。