设计模式07---设计模式之工厂方法模式(Factory Method)
1.场景问题
导出数据的应用框架
考虑这样一个实际应用,实现一个导出数据的应用框架,来让客户选择数据的导出方式(可能有数据库导出方式,可能有文本导出方式),并真正执行数据导出。
1.1框架的基础知识1.1.1框架是什么?框架是能完成一定功能的半成品软件。
1.1.2框架能干什么呢?能完成一定的功能,加快程序开发的速度
给我们一个精良的程序架构
1.1.3对框架的理解基于框架开发,事情还是那些事情,只是看谁做的问题。
基于框架开发,可以不去做框架所做的事情,但是应该明白框架在干什么,以及框架是如何实现其功能的。
1.1.4框架与设计模式的关系设计模式比框架更加抽象
设计模式是比框架更小的体系结构元素
框架比设计模式更加特例化
1.2问题所在:分析上面的应用框架,不管用户选择什么样的导出格式,最后导出的都是一个文件,而且系统不知道究竟要导出什么样的文件,因此应该有一个接口,来描述最后生成的对象,并操作输出的文件。
示例代码如下
Product实际使用对象的接口
ConcreteProduct具体的接口的实现对象
Creator创建器,声明工厂方法
ConcreteCreator具体的创建器的对象,覆盖实现Creator定义的工厂方法,返回具体的Product实例
2.2工厂方法模式示例代码
代码实现如下:
3.6.2使用Creator创建出来的对象的调用情况示意图如下
4.工厂方法模式与IoC/DI
IoC控制反转
DI依赖注入
4.1理解概念 4.1.1参与者都有谁?一个是某个对象,一个是IoC/DI容器,有一个是某个对象的外部资源
这里某个对相关当然是指任意的某个Java对象
4.1.2谁依赖谁?当然是某个对象依赖IoC/DI容器
4.1.3为什么需要依赖?对象需要IoC/DI的容器来提供对象需要的外部资源。
4.1.4谁注入谁?很明显是IoC/DI的容器来注入某个对象
4.1.5到底注入什么?
注入某个对象所需要的外部资源4.1.6谁控制谁?
4.1.7控制什么?
当然是IoC/DI的容器来控制对象主要是控制对象实例的创建
4.1.8为啥叫做“反转”?
4.1.9依赖注入和控制反转是同一概念么?
如果在A中需要C,那么会直接创建C的对象,这样就是A主动获取所需要的资源文件C类,这样被称为是正向的。那么什么叫做反向呢?就是说A不再主动获取C类。而是被动等待,等待IoC/DI获取一个C类的实例,然后反向的注入A中。依赖注入:应用程序依赖容器创建,并注入它所需要的外部资源;
控制反转:容器控制应用程序,由容器反向的向应用程序注入其所需要的外部资源。
4.2工厂方法模式与IoC/DI的关系上面讲了,有了IoC/DI后,应用程序不再主动了,而是被动的等待由容器来注入资源。那么在编写代码的时候,一旦要用到外部资源,就会开一个窗口,让容器能注入进来,也就是提供给容器使用过的注入的途径,当然这都不是重点,我们用setter注入来示例一下,使用IoC/DI的示例代码如下:
台式机希捷硬盘对象对应着台式机希捷硬盘对象的行为,笔记本IBM硬盘对应着笔记本IBM硬盘的行为,这是一种典型的平行的类层次结构。
主要用来把一个类层次中的某些行为分离出来,让类层次中的类把原本属于自己的原则,委托给分离出去的类去实现,从而使类层次更加简单,因此被称为平行的类层次结构。
6.参数化工厂方法定义:通过工厂方法传递参数,根据参数的不同,来创建不同的产品对象。
场景问题示例代码如下
package demo05.factorymethod.example7;public class Client {public static void main(String[] args) {// 创建需要使用的Creator对象ExportOperate operate = new ExportOperate2();// 下面变换传入的参数来测试参数化工厂方法operate.export(1, "Test1");operate.export(2, "Test2");operate.export(3, "Test3");}}7.工厂方法模式的优缺点:
优点:可以在不知道具体实现的情况下编程。
更容易扩展新对象的版本
连接平行的类层次
缺点:具体产品对象和工厂方法的耦合性
8.思考工厂方法模式:本质:延迟到子类才实现。
注意:在选择实现的时候,可能会感觉像是简单工厂模式,实际上具体实现都是“选择实现”,但是不同点在于简单工厂是在工厂中实现,而工厂方法中会把这个工作延迟到子类来实现。
9.对设计原则的体现工厂方法模式很好的体现了“依赖倒置原则”
依赖倒置原则告诉我们:要依赖抽象,不要依赖具体类。
10.心得泥马,这个工厂方法模式真蛋疼,我理解了好几天呢,说实话,不好理解,现在我只处于看懂了的阶段,还没有融会贯通,先写出来,以后慢慢理解