目录
1. 工厂方法模式概述
1.1 工厂方法模式概念
又称为虚拟构造器(Virtual Constructor)模式或多态模式,属于创建型模式。
在工厂方法模式中,父类负责定义创建对象的公共接口,而子类负责生产具体的对象,这样做的目的是将类的实例化操作延迟到子类中来完成,即由子类决定实例化哪一个类。核心的工厂类不再负责所有的产品的创建,而是将具体创建的工作交给子类去做
1.2 工厂方法模式类图
Factory 表示抽象工厂,定义了工厂接口,它声明了工厂方法,返回一个产品。 FactoryXXX 表示具体工厂(ConcreteFactory),它实现了工厂方法,由客户端调用,返回一个产品的实例。 Product 表示抽象产品,定义了产品的接口。 ProductXXX 表示具体产品,实现了抽象产品接口。
2. 工厂方法模式实现原理
下面以生产宝马,奥迪汽车和消费者消费汽车为实例:
汽车接口类:
/** * 汽车接口 * @author Administrator */ public interface Car { //启动汽车方法 public void run(); }
宝马汽车类:
/** * 宝马汽车类 * @author Administrator */ public class BaoMaCar implements Car{ @Override public void run() { System.out.println("宝马汽车启动!"); } }
奥迪汽车类:
/** * 奥迪汽车类 * @author Administrator */ public class AoDiCar implements Car{ @Override public void run() { System.out.println("奥迪汽车启动!"); } }
工厂接口类:
/** * 汽车工厂接口 * @author Administrator */ public interface Factory { //返回汽车实例 public Car produceCar(); }
宝马工厂类:
/** * 宝马汽车工厂类 * @author Administrator */ public class BaoMaFactory implements Factory{ //返回宝马汽车实例对象 @Override public Car produceCar() { return new BaoMaCar(); } }
奥迪工厂类:
/** * 奥迪汽车工厂类 * @author Administrator */ public class AoDiFactory implements Factory{ //返回奥迪汽车实例对象 @Override public Car produceCar() { return new AoDiCar(); } }
消费者类:
/** * 消费者类 * @author Administrator */ public class Customer { public static void main(String[] args) { AoDiFactory aoDiFactory = new AoDiFactory(); //得到奥迪对象实例 aoDiFactory.produceCar().run(); BaoMaFactory baoMaFactory = new BaoMaFactory(); //得到宝马对象实例 baoMaFactory.produceCar().run(); } }
运行效果:
奥迪汽车启动! 宝马汽车启动!
可以看出,工厂模式比简单工厂模式的实现方式不同。核心的工厂类不再负责所有的产品的创建,而是将具体创建的工作交给子类去做。如果有新的产品,只需添加相应的产品和产品工厂类即可。
3. 工厂方法模式优缺点
当工厂方法模式的工厂类只有一个,且工厂方法为静态方法时,就变成了简单工厂模式。
3.1 优点
工厂方法方法模式是简单工厂模式的衍生,解决了许多简单工厂模式的问题。首先完全实现开闭原则,实现了可扩展。其次更复杂的层次结构,可以应用于产品结果复杂的场合。 在系统中加入新的产品时,无须修改抽象工厂和抽象产品提供的接口,无须修改客户端,也无须修改其他具体工厂和具体产品,而只要添加一个具体工厂和具体产品即可,这样系统的可扩展性变得很好,符合开闭原则。 工厂方法模式隔离了具体类的生成,使得客户端并不需要知道什么样的对象被创建。用于这样的隔离,使得更换一个具体工厂就变得容易。 3.2 缺点
在添加新产品的时候,需要编写新的具体产品类,而且还要提供与之对应的具体工厂类,这样会增加系统类的个数,增加系统开销。