在简单工厂模式中,所有的对象都在一个工厂中创建,当项目更为复杂、需要创建的对象较多的时候,工厂类中将包含大量的逻辑代码去创建这些对象。这时候就需要用到工厂方法模式。个人理解,工厂方法模式就是把简单工厂模式中的工厂类按照职能拆分成多个工厂类(这时候突然想到面向对象设计原则中的单一职责原则)。
利用上一篇博文中的示例代码改为采用工厂方法模式实现,翻译器接口(Translate.java)的示意代码如下:
packagecom.factorymethod; publicinterfaceTranslate{ publicStringsayTxt(Stringtxt); }
英文翻译器的实现类(EnglishTranslate.java):
packagecom.factorymethod; publicclassEnglishTranslateimplementsTranslate{ publicStringsayTxt(Stringtxt){ return"Hello:"+txt; } }
中文翻译器的实现类(ChineseTranslate.java):
packagecom.factorymethod; publicclassChineseTranslateimplementsTranslate{ publicStringsayTxt(Stringtxt){ return"你好"+txt; } }
和简单工厂模式不同的是,采用工厂方法模式需要首先建立一个工厂接口类(FactoryMethod.java),之后再建立不同的工厂实现类(太简单,我就不贴代码了)。
当一个类在创建某个对象时,还不知道这个对象的具体实现,只是定义类简单的接口,此时采用工厂方法模式比较好。这么说可能比较抽象,我刚看这句话也不大理解,直接看代码。
这相当于一般情况下的工厂接口类,只不过改成了抽象类(FactoryMethod.java):
packagecom.factorymethod; publicabstractclassFactoryMethod{ protectedabstractTranslatefactoryMethod(); /** *需要翻译的话语 */ publicStringsayTxt(Stringtxt){ Translatetranslate=factoryMethod(); returntranslate.sayTxt(txt); } }
建立翻译英文的工厂实现类(EnglishFactoryMethod.java),示意代码如下:
packagecom.factorymethod; publicclassEnglishFactoryMethodextendsFactoryMethod{ publicTranslatefactoryMethod(){ returnnewEnglishTranslate(); } }
建立翻译中文的工厂实现类(ChineseFactoryMethod.java),示意代码如下:
packagecom.factorymethod; publicclassChineseFactoryMethodextendsFactoryMethod{ publicTranslatefactoryMethod(){ returnnewChineseTranslate(); } }
packagecom.factorymethod; publicclassClient{ publicstaticvoidmain(String[]args){ FactoryMethodfactoryMethod=newChineseFactoryMethod(); System.out.println(factoryMethod.sayTxt("测试")); factoryMethod=newEnglishFactoryMethod(); System.out.println(factoryMethod.sayTxt("测试")); } }
运行客户端,结果显示如下:
你好测试 Hello:测试
如果又有新的需求,需要翻译另一种语言,只需要增加一个翻译实现类和一个工厂实现类(开闭原则)。
新增另一种语言翻译实现类(SomethingTranslate.java):
packagecom.factorymethod; publicclassSomethingTranslateimplementsTranslate{ publicStringsayTxt(Stringtxt){ return"某种语言:"+txt; } }
增加工厂实现类SomethingFactoryMethod:
packagecom.factorymethod; publicclassSomethingFactoryMethodextendsFactoryMethod{ @Override protectedTranslatefactoryMethod(){ returnnewSomethingTranslate(); } }
测试客户端(Client.java)代码改为:
packagecom.factorymethod; publicclassClient{ publicstaticvoidmain(String[]args){ FactoryMethodfactoryMethod=newChineseFactoryMethod(); System.out.println(factoryMethod.sayTxt("测试")); factoryMethod=newEnglishFactoryMethod(); System.out.println(factoryMethod.sayTxt("测试")); factoryMethod=newSomethingFactoryMethod(); System.out.println(factoryMethod.sayTxt("测试")); } }
运行Client,显示为:
你好测试 Hello:测试 某种语言:测试
简单来说,工厂方法模式就是对简单工厂模式的一种优化,采用解偶的原则,将每个对象的创建再单独分离了出来。体现了老师上课时常说的“高内聚,低耦合”的思想。