为什么要使用工厂模式?
class Produce {
public static void main(String[] args) {
Fruit f = new Apple();
f.eat();
}
}
interface Fruit {
public void eat();
}
class Apple implements Fruit {
@Override
public void eat() {
System.out.println("吃苹果");
}
}
上面的程序没有任何问题,但是却有极强的耦合性,蔬菜不可能只有一种,当我我们为Fruit增加子类Orange,如果客户端(人)想要吃橘子时,我们就不得不去改变客户端的程序。但是客户端最关心的是如何取得Fruit接口对象,而后取得其中的方法,但是他是被谁实例化的客户端并不关心,所以我们需要加一个过渡,就是我们的工厂类。
//工厂模式
class Produce {
public static void main(String[] args) {
Fruit f = Factory.getInstance("apple");
f.eat();
}
}
class Factory{
public static Fruit getInstance(String name){
if("apple".equals(name)){
return new Apple();
}else if("orange".equals(name)){
return new Orange();
}
return null;
}
}
interface Fruit {
public void eat();
}
class Apple implements Fruit {
@Override
public void eat() {
System.out.println("吃苹果");
}
}
class Orange implements Fruit {
@Override
public void eat() {
System.out.println("吃橘子");
}
}
图解
可以看出工厂类是一个独立的类
和反射结合
但是此时我们会发现 每当我们要增加一个子类都需要改动工厂类耦合性还是很强,还是因为new关键字,所以我们用另一种实例化对象的方法,既反射;
//工厂模式
class Produce {
public static void main(String[] args) {
try {
Factory.getInstance("Apple").eat();
} catch (Exception e) {
e.printStackTrace();
}
}
}
class Factory {
public static Fruit getInstance(String name) throws Exception {
Fruit fruit = (Fruit) Class.forName(name).newInstance();
return fruit;
}
}
interface Fruit {
public void eat();
}
class Apple implements Fruit {
@Override
public void eat() {
System.out.println("吃苹果");
}
}
class Orange implements Fruit {
@Override
public void eat() {
System.out.println("吃橘子");
}
}
此时我们不需要改动工厂类就可以增加子类,只需要在客户端传入完整类名路径即可。