抽象工厂模式-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());
}
}