抽象工厂模式提供一个接口,让你可以在不指定具体类的情况下,创建一类有关联或依赖的对象。
    例子:

    一个王国都拥有自己的国王,城堡,和军队。 但是,精灵王国拥有的是精灵国王,精灵城堡,精灵军队;而兽人王国拥有的则是兽人国王,兽人城堡,兽人军队。

    如何使用代码任意地创建精灵王国和兽人王国呢。
    使用抽象工厂模式,将国王,城堡和军队抽象化,提供这三类事物的接口:

    1. public interface King {
    2. String getDescription();
    3. }
    4. public interface Castle {
    5. String getDescription();
    6. }
    7. public interface Army {
    8. String getDescription();
    9. }

    这三个接口下,都可以有任意个实现类,在当前例子中,则需要两个实现类,分别对应精灵和兽人,即精灵国王,兽人国王,精灵城堡,兽人城堡,精灵军队,兽人军队。
    然后需要一个工厂类去创建一个精灵王国或者兽人王国。
    分别是精灵王国工厂类和兽人王国工厂类。这样我们也可以抽象出一个“王国工厂”的接口:

    1. public interface KingdomFactory {
    2. Castle createCastle();
    3. King createKing();
    4. Army createArmy();
    5. }

    接口里提供了三个方法,分别为创建国王,创建城堡,创建军队的方法。
    精灵王国工厂类的实现如下:

    1. public class ElfKingdomFactory implements KingdomFactory {
    2. @Override
    3. public Castle createCastle() {
    4. return new ElfCastle();
    5. }
    6. @Override
    7. public King createKing() {
    8. return new ElfKing();
    9. }
    10. @Override
    11. public Army createArmy() {
    12. return new ElfArmy();
    13. }
    14. }

    兽人王国工厂类的实现如下:

    1. public class OrcKingdomFactory implements KingdomFactory {
    2. @Override
    3. public Castle createCastle() {
    4. return new OrcCastle();
    5. }
    6. @Override
    7. public King createKing() {
    8. return new OrcKing();
    9. }
    10. @Override
    11. public Army createArmy() {
    12. return new OrcArmy();
    13. }
    14. }

    如此,通过不同的工厂类就可以创建不同的王国。
    还可以使用工厂的工厂,在运行时,根据参数的不同来创建不同的工厂类:

    1. public static class FactoryMaker {
    2. public enum KingdomType {
    3. ELF, ORC
    4. }
    5. public static KingdomFactory makeFactory(KingdomType type) {
    6. switch (type) {
    7. case ELF:
    8. return new ElfKingdomFactory();
    9. case ORC:
    10. return new OrcKingdomFactory();
    11. default:
    12. throw new IllegalArgumentException("KingdomType not supported.");
    13. }
    14. }
    15. }

    通过一个枚举,代表创建不同的工厂。