设计模式---工厂方法模式
来源:互联网 发布:css js 执行环境 编辑:程序博客网 时间:2024/06/08 12:40
定义
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
通用模版
产品:
抽象工厂:
具体工厂:
场景:
应用场景
- 工厂方法模式是new一个对象的替代。
- 需要灵活的、可扩展的框架时,可考虑此模式。
- 异构项目中使用。(WebService与一个非Java项目交互)
- 测试驱动开发框架。(JMock或者EasyMock替代)
扩展
1、缩小为简单工厂模式
场景:一个模块只需要一个工厂类。
解决:使用静态类型替代抽象工厂类。
修改模版:删除抽象工厂类Creator、修改ConcreteCreator类,如下图:
2、升级为多个工厂类
场景:初始化一个对象很耗费精力时,所有的产品类放入一个工厂方法中初始化会使代码结构不清。
解决:为每个产品定义一个创造者,由调用者选择与哪个工厂方法关联。(复杂应用中添加一个协调类,封装子工厂类,对高层提供统一访问接口,避免调用者与各子工厂类交流)
修改模版:
- 修改抽象工厂类
- 修改具体工厂类(可以创建多个具体工厂类)
/** * 具体工厂类(多工厂模式) * @author Carol * */public class ConcreteCreator1 extends Creator {public <T extends Product> T createProduct(){return new Product1();
3、替代单例模式
场景:使用工厂方法模式替代单例模式
代码:
代码:
工厂类:
4、延迟初始化
场景:一个对象被消费完毕后,并不立即释放,工厂类保持其初始状态,等待再次被使用。(例如:JDBC连接数据库)
解决:ProductFactory负责产品类对象创建工作,并且通过prMap变量产生一个缓存,对需要重用的对象保存。
代码:
/** * 延迟加载的工厂类 * @author Carol * */public class ProductFactory {private static final Map<String,Product> prMap = new HashMap();public static synchronized Product createProduct(String type) throws Exception{Product product = null;//如果map中有这个对象了if(prMap.containsKey(type)){product = prMap.get(type);}else{if(type.equals("product1")){product = new ConcreteProduct1();}else{product = new ConcreteProduct2();}//将对象放入缓存容器中prMap.put(type, product);}return product;}}
0 0
- 设计模式--工厂方法
- 工厂方法设计模式
- 设计模式-工厂方法
- 【设计模式】【工厂方法】
- 设计模式 - 工厂方法
- 工厂方法设计模式
- 工厂方法设计模式
- 【设计模式】工厂方法
- 设计模式--工厂方法
- 设计模式---工厂方法
- 设计模式-工厂方法
- 工厂方法设计模式
- 工厂方法设计模式
- 设计模式-工厂方法
- 设计模式 工厂方法
- 工厂方法设计模式
- 工厂方法设计模式
- 设计模式 - 工厂方法
- hdu 1874 畅通工程续(图论:两点之间最短路-弗洛伊德算法 || 贝尔曼福特算法)
- Stanford机器学习---第8讲. 支持向量机SVM
- uefi引导装win8.1
- 判断dataGridView是否重复值
- 码农创业记(一)
- 设计模式---工厂方法模式
- Stanford机器学习---第9讲. 聚类
- Stanford机器学习---第10讲. 数据降维
- linux C++静态库 动态库的生成于调用
- osi 七层模型
- Unix/Linux环境C编程入门教程(28) 日期时间那些事儿
- linux下查找文件的方法
- POJ 2472 106 miles to Chicago
- linux下tar.gz、tar、bz2、zip等解压缩、压缩命令小结