工厂模式(工厂方法)

简单工厂的缺点就是扩展性不强,当有新的类型产生的时候,将对负责生产的主类进行修改。主类负责太多的业务逻辑,要避免这种情况的产生,就是将生产类功能抽象化。还是以上文中的水果为例子:

水果接口:

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();

 }

}

工厂方法灵活运用了继承的原理,通过客户要生产什么类型的水果,从而去拿具体生产水果的实例工厂。如果系统需要加入一个新的产品,那么所需要的就是向系统中加入一个这个产品的对应的工厂类,没必要去修改客户端。完全支持开闭原则。

 

你可能感兴趣的:(apple)