抽象工厂模式-Abstract Factory(Java实现)

抽象工厂模式-Abstract Factory

在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

本文以github上iluwatar的例子为例.

一个国家有军队, 城堡, 国王. 如果想要创建一个王国(国家), 那么就需要在每个国家创建时都要去重复这些定义.

所以用抽象工厂模式, 把创建王国的这个工厂抽象出来. 国家的组成成分都是这些,在抽象工厂中只需要定义出来即可, 国家之间只是细节不一样, 所以由具体的王国来实现具体的军队/城堡/王国工厂的实现. 

接口的定义

Army接口

/**
 * 军队
 */
public interface Army {
    String getDescription();
}

Castle接口

/**
 * 城堡
 */
public interface Castle {
    String getDescription();
}

King接口

/**
 * 国王
 */
public interface King {
    String getDescription();
}

KingdomFactory接口

可以创建国家的工厂的抽象定义.

/**
 * 国家
 */
public interface KingdomFactory {
    Castle createCastle();

    King createKing();

    Army createArmy();
}

具体工厂的实现

到此为止, 抽象定义都完成了, 让我们来看一下如果想要创建一个国家, 需要继续实现哪些内容.

不只是创建第一个国家, 以后每次加一个国家, 都是如此, 不需要去改动底层的抽象定义.

咱们开始创建一个奥克斯王国吧

OrcArmy类

public class OrcArmy implements Army {
    private static final String DESCRIPTION = "这是奥克斯王国的军队!";

    @Override
    public String getDescription() {
        return DESCRIPTION;
    }
}

OrcCastle类

public class OrcCastle implements Castle {
    private static final String DESCRIPTION = "这是奥克斯王国的城堡!";

    @Override
    public String getDescription() {
        return DESCRIPTION;
    }
}

OrcKing类

public class OrcKing implements King {
    private static final String DESCRIPTION = "这是奥克斯王国的国王!";

    @Override
    public String getDescription() {
        return DESCRIPTION;
    }
}

OrcKingdomFactory类

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

Main

用于测试运行

public class Main {
    public static void main(String[] args) {
        KingdomFactory factory = new OrcKingdomFactory();

        Army orcArmy = factory.createArmy();
        King orcKing = factory.createKing();
        Castle orcCastle = factory.createCastle();

        System.out.println(orcArmy.getDescription());
        System.out.println(orcKing.getDescription());
        System.out.println(orcCastle.getDescription());
    }
}

  

posted @ 2018-05-08 19:27  GoldArowana  阅读(323)  评论(0编辑  收藏  举报