在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的。但是在一些情况下, new操作符直接生成对象会带来一些问题。举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置;
比如在我的一个报表系统中,有一种报表生成事件,该事件实现run接口,实现具体的报表生成操作,但是它不能被new出来,因为它需要依赖spring的依赖注入的各种service对象. 所以这时就需要工厂模式
类图:
抽象的基础报表导出事件
其中的一个子类:
工厂类:
生产报表事件:
ReportEvent reportEvent = ReportEventFactory.getInstance().createEvent(DhOrderReportEvent.class,parameter);
将事件放到队列里
boolean add = TaskQueueUtil.reportQueue.add(reportEvent);
取出报表事件,执行操作
ReportEvent reportEvent = TaskQueueUtil.reportQueue.poll();
if (reportEvent!=null) {
threadPoolTaskExecutor.execute(reportEvent);
}
工厂模式解决的问题:将同一类的对象的创建收集成一个工厂类,通过参数来区分实际生产的对象,其实,工厂模式是面向接口编程的一种实现.
还有一种例子是java的jdbc实现,操作数据库的统一接口,再有一个工厂类,由工厂类的参数来决定生产的对象是面向mysql的还是oracle的.
案例:报表系统的报表事件,cxf客户端,java的jdbc实现.
cxf客户端:由工厂来统一生产各接口的具体实现,具体实现很复杂,封装起来.
抽象工厂方法 其实是 工厂方法的一种升级. 应用于更复杂的业务场景.