(2)工厂方法模式
2015-07-12 15:17
267 查看
一:工厂方法模式的优点
--->工厂方法模式是类的创建模式,又叫做虚拟构造子(Virtual Constructor)模式或者多态性工厂(Polymorphic Factory)模式。
--->工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中
二:工厂方法模式的缺点
--->
三:应用场景
--->如果使用简单工厂模式,则工厂类必定过于臃肿。因为简单工厂模式只有一个工厂类,它需要处理所有的创建的逻辑。假如以上需求暂时只支持3种导出的格式以及2种导出的结构,那工厂类则需要6个if else来创建6种不同的类型。如果日后需求不断增加,则后果不堪设想。
--->这时候就需要工厂方法模式来处理以上需求。在工厂方法模式中,核心的工厂类不再负责所有的对象的创建,而是将具体创建的工作交给子类去做。这个核心类则摇身一变,成为了一个抽象工厂角色,仅负责给出具体工厂子类必须实现的接口,而不接触哪一个类应当被实例化这种细节。
四:工厂方法模式的角色
--->抽象工厂(ExportFactory)角色:担任这个角色的是工厂方法模式的核心,任何在模式中创建对象的工厂类必须实现这个接口。在实际的系统中,这个角色也常常使用抽象类实现。
--->具体工厂(ExportHtmlFactory、ExportPdfFactory)角色:担任这个角色的是实现了抽象工厂接口的具体JAVA类。具体工厂角色含有与业务密切相关的逻辑,并且受到使用者的调用以创建导出类(如:ExportStandardHtmlFile)。
--->抽象导出(ExportFile)角色:工厂方法模式所创建的对象的超类,也就是所有导出类的共同父类或共同拥有的接口。在实际的系统中,这个角色也常常使用抽象类实现。
--->具体导出(ExportStandardHtmlFile等)角色:这个角色实现了抽象导出(ExportFile)角色所声明的接口,工厂方法模式所创建的每一个对象都是某个具体导出角色的实例。
五:工厂方法模式的代码示例
案例:前台传来不同的信息,生成不同的App工厂类,从而生成不同的App。
[1]工厂接口
View Code
[5]测试结果
Test2.main()向京东下订单:一条牛仔裤
Test2.main()向天猫下订单:一条花裙子
--->工厂方法模式是类的创建模式,又叫做虚拟构造子(Virtual Constructor)模式或者多态性工厂(Polymorphic Factory)模式。
--->工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中
二:工厂方法模式的缺点
--->
三:应用场景
--->如果使用简单工厂模式,则工厂类必定过于臃肿。因为简单工厂模式只有一个工厂类,它需要处理所有的创建的逻辑。假如以上需求暂时只支持3种导出的格式以及2种导出的结构,那工厂类则需要6个if else来创建6种不同的类型。如果日后需求不断增加,则后果不堪设想。
--->这时候就需要工厂方法模式来处理以上需求。在工厂方法模式中,核心的工厂类不再负责所有的对象的创建,而是将具体创建的工作交给子类去做。这个核心类则摇身一变,成为了一个抽象工厂角色,仅负责给出具体工厂子类必须实现的接口,而不接触哪一个类应当被实例化这种细节。
四:工厂方法模式的角色
--->抽象工厂(ExportFactory)角色:担任这个角色的是工厂方法模式的核心,任何在模式中创建对象的工厂类必须实现这个接口。在实际的系统中,这个角色也常常使用抽象类实现。
--->具体工厂(ExportHtmlFactory、ExportPdfFactory)角色:担任这个角色的是实现了抽象工厂接口的具体JAVA类。具体工厂角色含有与业务密切相关的逻辑,并且受到使用者的调用以创建导出类(如:ExportStandardHtmlFile)。
--->抽象导出(ExportFile)角色:工厂方法模式所创建的对象的超类,也就是所有导出类的共同父类或共同拥有的接口。在实际的系统中,这个角色也常常使用抽象类实现。
--->具体导出(ExportStandardHtmlFile等)角色:这个角色实现了抽象导出(ExportFile)角色所声明的接口,工厂方法模式所创建的每一个对象都是某个具体导出角色的实例。
五:工厂方法模式的代码示例
案例:前台传来不同的信息,生成不同的App工厂类,从而生成不同的App。
[1]工厂接口
package com.yeepay.sxf.test; import com.yeepay.sxf.interfaces.APPFactoryInterFace; import com.yeepay.sxf.interfaces.App; import com.yeepay.sxf.interfaces.impl.JdAppFactory; import com.yeepay.sxf.interfaces.impl.TmAppFactory; public class Test2 { public static void main(String[] args) { //早上10:00:01 APPFactoryInterFace factory=new JdAppFactory(); App app=factory.createApp("创建京东工厂需要的材料"); String result=app.giveOrder("一条牛仔裤"); System.out.println("Test2.main()"+result); //早上10:00:01 factory=new TmAppFactory(); app=factory.createApp("创建天猫工厂需要的材料"); result=app.giveOrder("一条花裙子"); System.out.println("Test2.main()"+result); } }
View Code
[5]测试结果
Test2.main()向京东下订单:一条牛仔裤
Test2.main()向天猫下订单:一条花裙子
相关文章推荐
- 关于素数
- java编程思想——java IO系统
- 深度学习之四:常用模型和方法
- Android实习04:ListView网络异步加载图片的优化显示(2)
- BloomFilter——大规模数据处理利器[转]
- JavaScript作用域闭包(你不知道的JavaScript)
- 简单vector实现
- Android 启动照相机拍照无返回
- JavaScript作用域闭包(你不知道的JavaScript)
- javascript 面向对象
- 数位DP小结
- Struts2 + uploadify 多文件上传完整的例子!
- json字符串的拼接
- C语言 gets()和scanf()函数的区别
- iOS阶段学习第20天笔记(MRC内存管理)
- android自定义PopupWindow,不显示内容
- sdut2852 小鑫去爬山9dp入门)
- NRF51822 download 程序出错
- Qt、QtCreator及opencv的安装
- javascript位置相关知识点整理