接下来会使用java来实现工厂模式
传统工厂模式
如果是你自己写的接口,要想取得本接口的实例化对象,最好使用工厂类来设计。但我么也需要知道传统工厂所带来的问题
范例:传统工厂使用new
interface IFruit {
public void eat();
}
class Apple implements IFruit {
@Override
public void eat() {
System.out.println("[Apple] eat");
}
}
class Factory {
private Factory() {
};
public static IFruit getInstance(String classname) {
if (classname.equals("Apple")) {
return new Apple();
}
return null;
}
}
public class FactoryModel {
public static void main(String[] args) {
IFruit fruit = Factory.getInstance("Apple");
fruit.eat();
}
}
这样就实现了一个简单的工厂类,通过使用new关键字来新建对象,但是这种方式在实际开发中但是我们基本不会用。一旦这个实现这个接口的对象增加,我们就需要不断的修改工厂类来适应新的类。比如增加了orange,我们就需要在Factory中添加一个判断,判断是否为Orange,一旦实现的类增加,这个工厂类将无比庞杂。
范例: 反射实现工厂类
class Factory {
private Factory() {
};
public static IFruit getInstance(String classname) {
IFruit fruit = null;
try {
fruit = (IFruit) Class.forName(classname).newInstance();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return fruit;
}
}
public class FactoryModel {
public static void main(String[] args) {
IFruit fruit = Factory.getInstance("model.Apple");
fruit.eat();
}
}
这里修改了getInstance函数,通过使用反射,只需要传递类的完整的名字,就可以获取这个类的实例对象了。
这样解决了同一个接口的问题,但是一个项目中,可能有成千上万的接口,但是其实逻辑是差不多的,如果为此增加如此的代码量,显然是不可取的。所以我们考虑使用泛型。
添加泛型实现工厂类
class Factory {
private Factory() {
};
public static <T> T getInstance(String classname) {
T obj = null;
try {
obj = (T) Class.forName(classname).newInstance();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return obj;
}
}
public class FactoryModel {
public static void main(String[] args) {
IFruit fruit = Factory.getInstance("model.Apple");
fruit.eat();
}
}
这样,你只需要传入类的名字,就可以获取该类的对象了。
这里是我自己学习的总结,代码基本可以通过课堂查看,下面是阿里Java课堂