【转】IOC和工厂模式联合使用简化工厂模式

转自:http://www.cnblogs.com/mypm/archive/2011/02/09/1950130.html

目录:

1:应用场景

2:传统工厂模式

3:传统工厂模式实现1中应用场景的弊端

4:IOC和工厂模式连合使用实现1中描述的场景

 

1:应用场景

在MYPM的工作流业务中,有三种业务对像可以走工作流,分别为:文档,项目和工作任务;这三种业务对像在走工作流时,具体处理业务是有差别的,工作流引擎要根据不同的业务对像(文档,项目和工作任务),调用不同的处理器.

2:传统工厂模式

(1)简单工厂模式

用法:客户端利用SimpleFactory产生一个具体产品(用AbstractProduct引用),当然这需要客户端传参,但判断逻辑位于SimpleFactory中(如switch语句)。

扩展:若需要增加具体产品E,则须添加ConcreteProductE类,同时修改SimpleFactory。

修改:若需要修改具体产品A,则只需修改ConcreteProductA类。

(2)工厂方法模式

用法:客户端根据需要的产品选择工厂(实例化具体工厂A,用AbstractFactory引用),再用该工厂制造产品(用AbstractProduct引用)。

扩展:若需要增加具体产品E,则须添加ConcreteProductE类和ConcreteFactoryE。

修改:直接修改相应产品。

(3)抽象方法模式

用法:客户端根据需要的产品选择工厂(实例化具体工厂A,用AbstractFactory引用),再用该工厂制造产品(用AbstractProduct引用)。相比而言,抽象工厂模式的好处是易于转换产品的系列(如由A系列转换为B系列)。

扩展:若需要增加产品3A和3B,则除了要增加3个类外还要修改FactoryA和FactoryB。若需要增加产品系列C,除了增加相应的类外,还要增加FactoryC类。

修改:直接修改相应的类。

3:传统工厂模式实现1中应用场景的弊端

应用场景

  在MYPM的工作流业务中,有三种业务对像可以走工作流,分别为:文档,项目和工作任务;这三种业务对像在走工作流时,具体处理业务是有差别的,工作流引擎要根据不同的业务对像(文档,项目和工作任务),调用不同的处理器.

 

在1中所描述场景,用简单工厂模式实现代码中会有很多if else
或是switch语句;用工厂方法模式或抽象方法模式实现时,会增加类。且看下面IOC和工厂模式连合使用后三种工厂模式(简单工厂模式、工厂方法模式、
抽象方法模式)合并成简单工厂模式使用且代码中无任何if else 或是switch语句

4:IOC和工厂模式连合使用业实现1中描述的场景

思路其实很简单:

在工厂中持有一map(通过IOC注入),key 为简单工厂中要传入的参数,value为实现了处理器接口   WorkFlowTaskHandler的具体实现。取出具体的“产品”,即场景中的处理器

在工作流引擎中中调用方式如下

//getHanerByTask 方法中传入要处理的工作流任务类型

WorkFlowTaskHandler handler = taskHandlerFactory.getHanerByTask(dto.getTask().getTaskType());

getHanerByTask方法中,根本不用else if 判断 因为dto.getTask().getTaskType() 的值一定是map中某个key,因为有这个约定:

map 的key 0,1,2, KEY本身就作为表示业务对像类型的值 如果再加入一个业务对像,其类型值为5 那map中再注放一个key为5 value 为实现处理器接口的bean

//handleWfTask为处理器接口WorkFlowTaskHandler中定义的接口

handler.handleWfTask(dto);

下面请看具体实现

4.1 先看IOC配置,如下图所示taskHandlerFactory中持有workFlowHanderHold,workFlowHanderHold就是一个map

workFlowHanderHold中注入了 三个处理器,如有必要还可以继续注入实现了WorkFlowTaskHandler接口的任意类

4.2 工厂类,所下两图所示,TaskHandlerFactoryImpl的实现中,代码少之又少

时间: 2024-11-08 19:40:27

【转】IOC和工厂模式联合使用简化工厂模式的相关文章

从基础知识到重写Spring的Bean工厂中学习java的工厂模式

1.静态工厂模式其他对象不能直接通过new得到某个类,而是通过调用getInstance()方法得到该类的对象这样,就可以控制类的产生过程.顺带提一下单例模式和多例模式:  单例模式是指控制其他对象获得该对象永远只有同一个对象  而多例模式则是根据需要从某个具体集合中获取所需的对象 1 import java.util.ArrayList; 2 import java.util.List; 3 4 5 public class Car implements Moveable{ 6 private

设计模式之创建型模式—— 1.3 抽象工厂模式

<?php /**  * 1.3 抽象工厂模式  * 解决的问题:  *  如何解决多个类实例化对象的问题.  * 解决的方案:  *  提供一个创建一系列相关或相互依赖对象的  *    接口,而无需指定它们具体的类.  * 该模式包含四种角色:  *  1. 抽象产品角色(两个或多个)  *  职责:同工厂方法模式  *    2. 具体产品角色  *    职责:同工厂方法模式  *      3. 抽象工厂角色  *    职责:同工厂方法模式  *      4. 具体工厂角色  * 

十三、工厂模式Factory(创建型模式)

一.引子 话说十年前,有一个暴发户,他家有三辆汽车--Benz奔驰.Bmw宝马.Audi奥迪,还雇了司机为他开车.不过,暴发户坐车时总是怪怪的:上Benz车后跟司机说"开奔驰车!",坐上Bmw后他说"开宝马车!",坐上Audi说"开奥迪车!".你一定说:这人有病!直接说开车不就行了?! 而当把这个暴发户的行为放到我们程序设计中来时,会发现这是一个普遍存在的现象.幸运的是,这种有病的现象在OO(面向对象)语言中可以避免了.下面就以Java语言为基础

浅析设计模式(六)——创建型模式之Abstract-Factory(抽象工厂模式)

抽象工厂模式Abstract-Factory 本文的套路: 抽象工厂模式的定义 抽象工厂模式的参与者及其角色 抽象工厂模式的类图 抽象工厂模式的示例 参考 抽象工厂模式的定义 提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类. 前面[浅析设计模式(四)--创建型模式之Simple-Factory(简单工厂方法,非设计模式)]中介绍的简单工厂方法,虽然已经对变化的部分进行了封装,但是这里只由一个对象负责所有的具体类的实例化,因此每次有新增对象类型时,都需要改变工厂的源码进行扩展.

工厂方法(Factory Method)模式

一.工厂方法(Factory Method)模式 工厂方法(FactoryMethod)模式是类的创建模式,其用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟的子类中. 工厂方法模式是简单工厂模式的进一步抽象和推广.由于使用了多态性,工厂方法模式保持了简单工厂模式的有点,而且客服了它的缺点. 在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给予子类去做.这个核心类仅仅负责给出具体工厂必须实现的接口,而不接触哪一个产品类被实例化这种细节.这使得工厂方法模式可以允许

创建型模式1.2简单工厂模式

一.概念 简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例.从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一. 二.类图 三.具体介绍 简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例. 该模式中包含的角色及其职责 工厂(OpertionFactory)角色 简单工厂模式的核心,它负责实现创建所有实例的内部逻辑.工厂

工厂模式总结(简单工厂,工厂方法,抽象工厂)

工厂模式属于创建型模式,大致可以分为三类,简单工厂模式.工厂方法模式.抽象工厂模式. 通过两个例子讲解这三种工厂模式 示例一 简单工厂模式 首先介绍简单工厂模式,它的主要特点是需要在工厂类中做判断,从而创造相应的产品.当增加新的产品时,就需要修改工厂类.有点抽象,举个例子就明白了.有一家生产处理器核的厂家,它只有一个工厂,能够生产两种型号的处理器核.客户需要什么样的处理器核,一定要显示地告诉生产工厂.下面给出一种实现方案. 1 enum CTYPE {COREA, COREB}; 2 class

工厂模式二之真正工厂

简单工厂是将商店和工厂分开,把工厂生产的放到另外的一个clothesFactory对象中调用createClothes方法进行.这一节我们要实现真正的工厂. 回顾一下简单工厂的实现: 1 //创建一个衣服门面店模型. 2 var ClothesShop = function (){} 3 ClothesShop.prototype = { 4 sellClothes: function (color){ 5 var clothes = clothesFactory.createClothes(c

《JAVA与模式》之抽象工厂模式

场景问题 举个生活中常见的例子--组装电脑,我们在组装电脑的时候,通常需要选择一系列的配件,比如CPU.硬盘.内存.主板.电源.机箱等.为讨论使用简单点,只考虑选择CPU和主板的问题. 事实上,在选择CPU的时候,面临一系列的问题,比如品牌.型号.针脚数目.主频等问题,只有把这些问题都确定下来,才能确定具体的CPU. 同样,在选择主板的时候,也有一系列问题,比如品牌.芯片组.集成芯片.总线频率等问题,也只有这些都确定了,才能确定具体的主板. 选择不同的CPU和主板,是每个客户在组装电脑的时候,向