工厂方法(Factory Method)模式,又称多态工厂(Polymorphic Factory)模式或虚拟构造器(Virtual Constructor)模式。工厂方法模式经过定义工厂抽象父类(或接口)负责定义建立对象的公共接口,而工厂子类(或实现类)则负责生成具体的对象。java
工厂方法模式对简单工厂模式中的工厂类进一步抽象。核心工厂类再也不负责产品的建立,而是演变为一个抽象工厂角色,仅负责定义具体工厂子类必须实现的接口。同时,针对不一样的产品提供不一样的工厂。即每一个产品都有一个与之对应的工厂。这样,系统在增长新产品时就不会修改工厂类逻辑而是添加新的工厂子类,从而弥补简单工厂模式对修改开放的缺陷。spring
在实际项目中,工厂方法模式是使用较多的工厂模式。数据库
工厂方法模式由工厂接口(或抽象类)、一组实现工厂接口工厂类、一个产品接口(或抽象类)和一组实现产品接口的具体产品组成。某具体产品由其对应的具体工厂类建立。api
本节经过一个"喜闻乐见"的豪车系列,展现简单工厂模式的实现。示例代码以下:框架
// 产品接口 // public interface ICar { // 也可定义为抽象类,但接口扩展性更好 void drive(); } // 若干具体的产品 // public class Bmw implements ICar { @Override public void drive() { System.out.println("drive a Bmw"); } } public class Benz implements ICar { @Override public void drive() { System.out.println("drive a Benz"); } } public class Audi implements ICar { @Override public void drive() { System.out.println("drive a Audi"); } } // 工厂接口 // public interface IFactory { // 也可定义为抽象类,但接口扩展性更好 public ICar create(); } // 若干具体的工厂,与具体产品一一对应 // public class BmwFactory implements IFactory { @Override public ICar create() { return new Bmw(); } } public class BenzFactory implements IFactory { @Override public ICar create() { return new Benz(); } } public class AudiFactory implements IFactory { @Override public ICar create() { return new Audi(); } }
客户端经过new BenzFactory().create().drive()
便可建立Benz实例并调用其drive()方法。新增豪车时,只须要新增豪车自身产品类和对应的工厂类,而不须要修改任何已有类。ide
开源框架中,经常经过配置文件制定具体的工厂类,其模式形如:code
public <T> T getProduct(typeOrName) { IProductFactory iProductFactory = getIProductFactory(); // 经过配置文件获取具体工厂类 return iProductFactory.getProduct(typeOrName); }
工厂方法模式的优势以下:对象
缺点以下:继承