工厂方法模式还比较好理解,它主要用于当一个功能有多种实现方案,而我们需要根据参数使用其中一种实现方案的场景下。
我们先看看工厂方法模式的大概套路,假设有三个搜索引擎的实现,分别是Google,Baidu,Yahoo,我们需要根据不同语言返回不同的搜索引擎。
首先定义ISearchEngine
接口和search
方法。
public interface ISearchEngine {
String search(String text);
}
然后是三个ISearchEngine
的实现类,Google,Baidu,Yahoo。
1public class Google implements ISearchEngine {
2 @Override
3 public String search(String text) {
4 return "Results in English";
5 }
6}
7
8public class Baidu implements ISearchEngine {
9 @Override
10 public String search(String text) {
11 return "中文结果";
12 }
13}
14
15public class Yahoo implements ISearchEngine {
16 @Override
17 public String search(String text) {
18 return "日本の結果";
19 }
20}
最后是工厂类,根据不同的语言返回不同的搜索引擎实现类。
public class SearchEngineFactory {
public static ISearchEngine createEngine(String lang) {
switch (lang) {
case "zh": return new Baidu();
case "jp": return new Yahoo();
default: return new Google();
}
}
}
这看上去和直接在使用的地方写个判断语句实例化不同的实现类没有多大区别,但是实际上工厂方法模式相对于直接实例化有几个优点。
工厂方法模式的特点,有一个接口和多个实现类,工厂类有一个方法可以根据参数实例化不同的实现类。工厂方法模式的优点是提高代码的了可维护性和可扩展性。