抽象工厂模式提供一个接口,让你可以在不指定具体类的情况下,创建一类有关联或依赖的对象。
例子:
一个王国都拥有自己的国王,城堡,和军队。 但是,精灵王国拥有的是精灵国王,精灵城堡,精灵军队;而兽人王国拥有的则是兽人国王,兽人城堡,兽人军队。
如何使用代码任意地创建精灵王国和兽人王国呢。
使用抽象工厂模式,将国王,城堡和军队抽象化,提供这三类事物的接口:
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 {@Overridepublic Castle createCastle() {return new ElfCastle();}@Overridepublic King createKing() {return new ElfKing();}@Overridepublic Army createArmy() {return new ElfArmy();}}
兽人王国工厂类的实现如下:
public class OrcKingdomFactory implements KingdomFactory {@Overridepublic Castle createCastle() {return new OrcCastle();}@Overridepublic King createKing() {return new OrcKing();}@Overridepublic 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.");}}}
通过一个枚举,代表创建不同的工厂。
