Spring与工厂模式的运用
形成代码之后大概会这么写:
?
publicclass Example1 {
? ?publicstaticvoid main(String[] args) {
? ? ? String specialParam = args[0];// 这是一个特定的参数
?
? ? ? Object[] param1 = new Object[] {};
? ? ? Object[] param2 = new Object[] {};
? ? ? Object[] param3 = new Object[] {};
? ? ? // ………… 以上是一堆常见、有规则的其他参数
?
? ? ? if ("CanShu1".equals(specialParam)) {
?
? ? ? ? ? // ………… 一堆冗长的程序
?
? ? ? } elseif ("CanShu2".equals(specialParam)) {
? ? ? ? ? // ………… 又一堆冗长的程序
?
? ? ? } elseif ("CanShu3".equals(specialParam)) {
?
? ? ? ? ? // ………… 再一堆冗长的程序
?
? ? ? } else {
?
? ? ? ? ? // ………… 其他默认的冗长的程序
? ? ? }
? ?}
}
?
? ?从这个示例的角度,代码挺清晰的,但是到了实际应用中,可能就会有数十套逻辑,可能会有长达数千行代码,可能会绕晕很多人。
如下是很常见的一个修改方式,将不同的流程提炼出独立的方法,让逻辑判断的位置独立出来。
publicclass Example2 {
?
? ?publicstaticvoid main(String[] args) {
? ? ? String specialParam = args[0];// 这是一个特定的参数
?
? ? ? Object[] param1 = new Object[] {};
? ? ? Object[] param2 = new Object[] {};
? ? ? Object[] param3 = new Object[] {};
? ? ? // ………… 以上是一堆常见、有规则的其他参数
?
? ? ? // 提炼独立方法
? ? ? if ("CanShu1".equals(specialParam)) {
? ? ? ? ? handleCanShu1(param1, param2, ?param3);
? ? ? } elseif ("CanShu2".equals(specialParam)) {
? ? ? ? ? handleCanShu2(param1, ?param2, param3);
? ? ? } elseif ("CanShu3".equals(specialParam)) {
? ? ? ? ? handleCanShu3(param1, ?param2, param3);
? ? ? } else {
? ? ? ? ? handleDefault(param1, ?param2, param3);
? ? ? }
? ?}
?
? ?publicstaticvoid handleCanShu1(Object[] ?param1, Object[] param2,
? ? ? ? ? Object[] param3) {
? ? ? // ………… 一堆冗长的程序
? ?}
?
? ?publicstaticvoid handleCanShu2(Object[] ?param1, Object[] param2,
? ? ? ? ? Object[] param3) {
? ? ? // ………… 又一堆冗长的程序
? ?}
?
? ?publicstaticvoid handleCanShu3(Object[] ?param1, Object[] param2,
? ? ? ? ? Object[] param3) {
? ? ? // ………… 再一堆冗长的程序
? ?}
?
? ?publicstaticvoid handleDefault(Object[] ?param1, Object[] param2,
? ? ? ? ? Object[] param3) {
? ? ? // ………… 其他默认的冗长的程序
? ?}
}
相信各位维护的旧项目里面不会缺乏此类代码。
? ? ? ? 从维护的角度来看:
?
? ? ? ? 以下是一套简单的实现代码:
publicclass Example3 {
? ?publicstaticvoid main(String[] args) {
? ? ? String specialParam = args[0];// 这是一个特定的参数
?
? ? ? Object[] param1 = new Object[] {};
? ? ? Object[] param2 = new Object[] {};
? ? ? Object[] param3 = new Object[] {};
? ? ? // ………… 以上是一堆常见、有规则的其他参数
? ? ? Example3Service service = ?Example3Factory.getService(specialParam);
? ? ? service.run(param1, param2, param3);
? ? ?
? ?}
}
调用其实是很简单的。
?
package com.test;
/**
* 提炼出工厂和接口
*/
publicclass Example3Factory {
? ?publicstatic Example3Service ?getService(String specialParam) {
? ? ? if ("CanShu1".equals(specialParam)) {
? ? ? ? ? returnnew Example3ServiceCanShu1Impl();
? ? ? } elseif ("CanShu2".equals(specialParam)) {
? ? ? ? ? returnnew Example3ServiceCanShu2Impl();
? ? ? } elseif ("CanShu3".equals(specialParam)) {
? ? ? ? ? returnnew Example3ServiceCanShu3Impl();
? ? ? } else {
? ? ? ? ? returnnew Example3ServiceDefaultImpl();
? ? ? }
? ?}
}
? ? ? ? 工厂类可以简单的如例子中写死,也可以写成collection形式,然后进行注册。
?
package com.test;
/**
* 提炼出工厂和接口
*/
publicinterface Example3Service {
? ?publicvoid run(Object[] param1, ?Object[] param2, Object[] param3);
}
?
? ? ? ? 接口神马的最简单了,以下就是接口实现:
package com.test;
?
publicclass Example3ServiceCanShu1Impl implements Example3Service ?{
? ?publicvoid run(Object[] param1, ?Object[] param2, Object[] param3) {
? ? ? // ………… 一堆冗长的程序
? ?}
}
package com.test;
?
publicclass Example3ServiceCanShu2Impl implements Example3Service ?{
? ?publicvoid run(Object[] param1, ?Object[] param2, Object[] param3) {
? ? ? // ………… 又一堆冗长的程序
? ?}
}
package com.test;
?
publicclass Example3ServiceCanShu3Impl implements Example3Service ?{
? ?publicvoid run(Object[] param1, ?Object[] param2, Object[] param3) {
? ? ? // ………… 再一堆冗长的程序
? ?}
}
package com.test;
?
publicclass Example3ServiceDefaultImpl implements Example3Service ?{
? ?publicvoid run(Object[] param1, ?Object[] param2, Object[] param3) {
? ? ? // ………… 其他默认的冗长的程序
? ?}
}
?
? ? ? ? 形成工厂模式的优点很明显:
package com.test;
import java.util.Map;
import javax.annotation.Resource;
publicclass Example4 {
? ?@Resource
? ?private Map example4ServiceMap;
? ?@Resource
? ?private Example4Service example4ServiceDefaultImpl;
?
? ?publicvoid runMain(String specialParam) ?{
? ? ? Object[] param1 = new Object[] {};
? ? ? Object[] param2 = new Object[] {};
? ? ? Object[] param3 = new Object[] {};
? ? ? // ………… 以上是一堆常见、有规则的其他参数
?
? ? ? Example4Service service = example4ServiceMap.get(specialParam);
? ? ? if (service == null) {
? ? ? ? ? service = example4ServiceDefaultImpl;
? ? ? }
? ? ? service.run(param1, param2, param3);
? ?}
}
?
? ? ? ? 工厂的内容直接用Spring配置完成:
?