在简单工厂模式中,是通过一个具体的类来创建不同的对象;在工厂方法模式中,一个具体的工厂类负责创建一个单独的对象;按照工厂模式,主程序需要分别去操作各个工厂类,可想而知,如果工厂类较多的话,仍然不利于管理。因此这里需要一个单独的较大的工厂对其它工厂进行操作,而主程序只需要操作这个较大的工厂即可。
在之前的翻译器示例中,再增加语义处理和语音播报的功能,按照抽象工厂模式进行修改。示意代码如下:
语义接口(Interpret.java):
package com.abstractfactory; public interface Interpret { public String doInterpret(String txt); }
英语语义实现类(EnglishInterpret.java)的示意代码如下:
package com.abstractfactory; public class EnglishInterpret implements Interpret { @Override public String doInterpret(String txt) { return "English Interpret: " + txt; } }
中文语义实现类(ChineseInterpret.java)的示意代码如下:
package com.abstractfactory; public class ChineseInterpret implements Interpret { @Override public String doInterpret(String txt) { return "解释中文语义" + txt; } }
语音播报接口(Speech):
package com.abstractfactory; public interface Speech { public String doSpeech(String txt); }
中文语音播报实现类(ChineseSpeech.java)的示意代码如下:
package com.abstractfactory; public class ChineseSpeech implements Speech { @Override public String doSpeech(String txt) { return "语音播报" + txt; } }
英语语音播报实现类(EnglishSpeech.java)的示意代码如下:
package com.abstractfactory; public class EnglishSpeech implements Speech { @Override public String doSpeech(String txt) { return "Speech Sound: " + txt; } }
抽象工厂类(FactoryMethod.java),示意代码如下:
package com.abstractfactory; public abstract class FactoryMethod { protected abstract Translate factoryMethodTranslate(); protected abstract Interpret factoryMethodInterpret(); protected abstract Speech factoryMethodSpeech(); /** * 需要翻译的话语 */ public String sayTxt(String txt) { Translate translate = factoryMethodTranslate(); Interpret interpret = factoryMethodInterpret(); Speech speech = factoryMethodSpeech(); return translate.sayTxt(txt) + "---" + interpret.doInterpret(txt) + "---" + speech.doSpeech(txt); } }
英语工厂实现类(EnglishFactoryMethod.java),示意代码如下:
package com.abstractfactory; public class EnglishFactoryMethod extends FactoryMethod { public Translate factoryMethodTranslate() { return new EnglishTranslate(); } public Interpret factoryMethodInterpret() { return new EnglishInterpret(); } public Speech factoryMethodSpeech() { return new EnglishSpeech(); } }
中文工厂实现类(ChineseFactoryMethod.java),示意代码如下:
package com.abstractfactory; public class ChineseFactoryMethod extends FactoryMethod { public Translate factoryMethodTranslate() { return new ChineseTranslate(); } public Interpret factoryMethodInterpret() { return new ChineseInterpret(); } public Speech factoryMethodSpeech() { return new ChineseSpeech(); } }
客户端(Client.java)的示意代码如下:
package com.abstractfactory; public class Client { public static void main (String[] args) { FactoryMethod factoryMethod = new EnglishFactoryMethod(); System.out.println(factoryMethod.sayTxt("测试")); factoryMethod = new ChineseFactoryMethod(); System.out.println(factoryMethod.sayTxt("测试")); } }
运行Client输出如下:
Hello:测试---English Interpret: 测试---Speech Sound: 测试 您好测试---解释中文语义测试---语音播报测试
在Client.java中可以看到,客户端实际上只对一个工厂类进行了操作,而调用其它更具体的工厂则交给抽象工厂去完成,降低了程序的耦合度,便于管理。
抽象工厂模式相对于工厂方法模式来说,就是工厂方法模式是针对一个产品系列的,而抽象工厂模式是针对多个产品系列的,即工厂方法模式是一个产品系列一个工厂类,而抽象工厂模式是多个产品系列一个工厂类。在抽象工厂模式中,客户端不在负责对象的创建,而是把这个责任丢给了具体的工厂类,客户端只负责对对象的调用,从而明确了各个类的职责。并且当一系列相互关联的产品被设计到一个工厂类里后,客户端的调用将会变得非常简单,而且,如果要更换这一系列的产品,则只需要更换一个工厂类即可。