工厂模式
举个例子
I18N接口
package com.imooc.factory.i18n;
//Internationalization
public interface I18N {
public String getTitle();
}
工厂 I18NFactory.java
public class I18NFactory {
public static I18N getI18NObject(String area) {
if(area.equals("china")) {
return new Chinese();
}else if(area.equals("spain")) {
return new Spainish();
}else if(area.equals("italy")) {
return new Italian();
}else {
return null;
}
}
}
public class Italian implements I18N{
public String getTitle() {
return "意大利";
}
}
public class Spainish implements I18N{
public String getTitle() {
return "西班牙";
}
}
入口类
public class Software {
public static void main(String[] args) {
I18N i18n = I18NFactory.getI18NObject("spain");
System.out.println(i18n.getTitle());
}
}
其原理就是,假如说开发一个项目。需要实现不同的语言,比如一个网页可以任意切换语言。方便不同国家的人进行阅读。采用工厂模式可以简单的实现国际化开发,避免无用的重复劳动。
我在初学反射的时候,并不能理解反射是用来干嘛的。学了一些API发现:“明明我自己能直接new一个对象,为什么它要绕一个圈子,先拿到Class对象,再调用Class对象的方法来创建对象呢,这不是多余吗?”
举个例子
一个数学运算的接口
public interface MathOperation {
public float operate(int a , int b);
}
接着是实现类
/**
* 加法
*/
public class Addition implements MathOperation {
@Override
public float operate(int a , int b) {
System.out.println("执行加法运算");
return a + b;
}
}
/**
* 减法运算
*/
public class Subtraction implements MathOperation {
@Override
public float operate(int a, int b) {
System.out.println("执行减法运算");
return a - b;
}
}
public static void case1(){
Scanner scanner = new Scanner(System.in);
System.out.print("请输入计算类名:");
String op = scanner.next();
System.out.print("请输入a:");
int a = scanner.nextInt();
System.out.print("请输入b:");
int b = scanner.nextInt();
MathOperation mathOperation = null;
if(op.equals("Addition")){
mathOperation = new Addition();
}
else if(op.equals("Subtraction")) {
mathOperation = new Subtraction();
}
else if(op.equals("Multiplication")){
mathOperation = new Multiplication();
}
else{
System.out.println("无效的计算类");
return;
}
float result = mathOperation.operate(a, b);
System.out.println(result);
}
public static void main(String[] args) {
ReflectSample.case1();
}
这是为了解决工厂模式采用的反射机制
public static void case2(){
Scanner scanner = new Scanner(System.in);
System.out.print("请输入计算类名:");
String op = scanner.next();
System.out.print("请输入a:");
int a = scanner.nextInt();
System.out.print("请输入b:");
int b = scanner.nextInt();
MathOperation mathOperation = null;
try {
mathOperation = (MathOperation) Class.forName("com.imooc.reflect." + op).newInstance();
}catch(Exception e){
System.out.println("无效的计算类");
return;
}
float result = mathOperation.operate(a, b);
System.out.println(result);
}