简单工厂的缺点就是扩展性不强,当有新的类型产生的时候,将对负责生产的主类进行修改。主类负责太多的业务逻辑,要避免这种情况的产生,就是将生产类功能抽象化。还是以上文中的水果为例子:
水果接口:
package 工厂模式.工厂方法;
public interface Fruit {
void grow();
void harvest();
void plant();
}
苹果:
package 工厂模式.工厂方法;
public class Apple implements Fruit {
public void grow() {
System.out.println("apple grow");
}
public void harvest() {
System.out.println("apple harvest");
}
public void plant() {
System.out.println("apple plant");
}
}
香蕉:
package 工厂模式.工厂方法;
public class Banana implements Fruit {
public void grow() {
System.out.println("Banana grow");
}
public void harvest() {
System.out.println("Banana harvest");
}
public void plant() {
System.out.println("Banana plant");
}
}
生产工厂(农夫)
package 工厂模式.工厂方法;
public interface FruitGardener {
public Fruit factory();
}
这个类和简单工厂的农夫类有很大的不同,区别就在这个类将生产的功能抽象化了,继而产生的是生产各种水果的工厂,例如生产苹果,不由农夫生产了,而是由农夫生产苹果共产,由苹果工厂去生产苹果。这种做法的扩展性非常的强。
苹果工厂:
package 工厂模式.工厂方法;
public class AppleGardener implements FruitGardener {
public Fruit factory() {
// TODO Auto-generated method stub
return new Apple();
}
}
香蕉工厂:
package 工厂模式.工厂方法;
public class BananaGardener implements FruitGardener {
public Fruit factory() {
// TODO Auto-generated method stub
return new Banana();
}
}
客户端:
package 工厂模式.工厂方法;
public class Client {
public static void main(String[] args) {
FruitGardener applegardener = new AppleGardener();
Apple apple = (Apple) applegardener.factory();
apple.plant();
}
}
工厂方法灵活运用了继承的原理,通过客户要生产什么类型的水果,从而去拿具体生产水果的实例工厂。如果系统需要加入一个新的产品,那么所需要的就是向系统中加入一个这个产品的对应的工厂类,没必要去修改客户端。完全支持开闭原则。