SCA (Service Component Architecture) 是一个开发SOA(Service-Oriented Architecture)面向服务应用的简单模型规范,它描述用于使用SOA构建应用程序和系统的模型。本文仅仅涉及插件式设计模式及工厂模式的深化和发展。
精巧的设计
QName name = source.getName(); StAXArtifactProcessor<?> processor = (StAXArtifactProcessor<?>)processors.getProcessor(name);
|
再看QName来自于何方神圣,在我们开发的例子程序中有Calculator.composite配置文件:
<component name="CalculatorServiceComponent"> <implementation.java class="calculator.CalculatorServiceImpl"/> |
上面的QName的localPart属性就是“component”,“implementation.java”,而这个QName是在读Calculator.composite文件时产生的,根据这个QName,我们就能找到要处理这个tag的类。如当读到“implementation.java”的QName,根据QName作为key值就在HashMap中找到JavaImplementationProcessor ,然后由JavaImplementationProcessor来处理。
“implementation.java“-〉JavaImplementationProcessor,多么令人拍案叫绝的设计啊!
(4)JDK 泛型在工厂模式中的应用
Tuscany是基于JDK1.5的开发出来的,其中大量使用了泛型等新特性,下面简单地介绍泛型在工厂模式中的应用。
泛型基础知识
泛型增加可读性和稳定性,如果说继承实现了子类型的多态的话,那么泛型则是实现了参数的多态,两者都是抽象机制的重要组成部分,两者能够在一定程度上相互替代,编译器会帮助你检查类型,保证类型安全。继承和泛型是两种方向上的重用技术,继承提供的是类型的纵向扩展,而泛型提供的是类型的横向抽象。两种技术都能够提供优秀的重用性。
在JDK1.4时,只能用继承,可以覆写接口或父类的方法,但注意如果覆写这些方法,必须按照接口或者父类的方法写(不论是参数类型系列,还是返回类型都必须和接口或父类保持完全一致),这样就限制了我们的发挥,呵呵!还是举个例子吧!
public interface Employee { public String getName(); } // Employee接口实现类1 public class EmployeeImpl implements Employee{ public String getName() { return "employee"; } } // Employee接口实现类2 public class DepartmentLeader implements Employee{ public String getName() { return "leader"; } } //Employee工厂接口 public interface EmployeeFactory { public Employee CreateEmployee(String employeeType); } //Employee工厂接口实现类 public class EmployeeFactoryImpl implements EmployeeFactory{ public Employee CreateEmployee(String employeeType) { Employee employee = null; if(employeeType.equalsIgnoreCase("employee")) { employee = new EmployeeImpl(); } else if(employeeType.equalsIgnoreCase("employee")) { employee = new DepartmentLeader(); } return employee; } }
|
我们再来看使用泛型的写法,父类或接口中定义了泛型约束,只要求这个“e”是Employee的子类即可,下面的两个实现类可以清楚地看到实现接口方法的返回类型不同了,但返回类型都是Employee的子类。
//使用泛型的Employee工厂接口 public interface EmployeeFactoryByGeneric<e extends Employee> { public e createEmployee(); } //使用泛型的DepartmentLeader工厂实现 public class DepartmentLeaderFactory implements EmployeeFactoryByGeneric<DepartmentLeader>{ public DepartmentLeader createEmployee() { return new DepartmentLeader(); } } //使用泛型的Employee工厂实现 public class EmployeeFactoryImplByGeneric implements EmployeeFactoryByGeneric<EmployeeImpl> { public EmployeeImpl createEmployee() { return new EmployeeImpl(); } }
|
这样有什么好处呢?让我们来看看如何调用的。可以看出调用方面没有什么大的区别。
JDK1.4的做法
EmployeeFactory factory = new EmployeeFactoryImpl(); Employee leader = factory.createEmployee("leader"); leader.getName();
|
使用泛型的做法:
EmployeeFactoryByGeneric factoryByGeneric = new DepartmentLeaderFactory(); Employee employee = factoryByGeneric.createEmployee(); employee.getName(); |