设计模式-工厂模式
1.定义
工厂模式属于设计模式中的创建型模式,在工厂模式中,创建对象不暴露创建逻辑(你只需要去4s店买你想要的车型,而不需要知道这辆车如何建造的),而是通过使用一个共同的接口来指向新创建的对象。
创建型模式
这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。引用菜鸟教程。
2.代码实现
可以用之前的反射提到的i18n 国际化的例子
I18N interface
package com.imooc.i18n;
public interface I18N {
public String say();
}
两个实现类
En.java
package com.imooc.i18n;
public class En implements I18N{
@Override
public String say() {
return "Struggle for your life";
}
}
Zhcn.java
package com.imooc.i18n;
public class En implements I18N{
@Override
public String say() {
return "Struggle for your life";
}
}
工厂类
package com.imooc.i18n;
public class I18NFactory {
public I18N getLanguage(String language){
if(language == null)
return null;
if(language.equalsIgnoreCase("English"))
return new En();
else if(language.equalsIgnoreCase("Chinese"))
return new Zhcn();
return null;
}
}
客户类
package com.imooc.i18n;
public class ApplicaitonZero {
public static void main(String[] args) {
I18NFactory i18NFactory = new I18NFactory();
I18N EnglishVersion = i18NFactory.getLanguage("English");
System.out.println(EnglishVersion.say());
I18N ChineseVersion = i18NFactory.getLanguage("Chinese");
System.out.println(ChineseVersion.say());
}
}
当然也可以用反射技术,使用配置文件的方式动态创建对象
config.properties
language=com.imooc.i18n.En
package com.imooc.i18n;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLDecoder;
import java.util.Properties;
public class Application {
public static void say(){
Properties properties = new Properties();
String configPath = Application.class.getResource("/config.properties").getPath();
try {
configPath = new URLDecoder().decode(configPath,"UTF-8");
properties.load(new FileInputStream(configPath));
String language = properties.getProperty("language");
I18N i18n = (I18N)Class.forName(language).newInstance();
System.out.println(i18n.say());
} catch (IOException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Application.say();
}
}
这种模式在使用XML进行配置的框架中大量应用,如 MyBatis
Spring