public abstract class XmlBuildFactoryTemplate {/** * 初始化工厂。根据路径读取XML文件,将XML文件中的数据装载到工厂中 * @param path XML文件的路径 */public void initFactory(String path){//寻找XML文件,读取数据流InputStream inputStream = findXmlFile(path);//解析XML文件,返回根Element root = readXmlStream(inputStream);//根据XML文件创建类,放入工厂中 buildFactory(root);}/** * 读取一个XML的文件,输出其数据流 * @param path XML文件的路径 * @return InputStream文件输入流 */protected InputStream findXmlFile(Stringpath) {......}/** * 读取并解析一个XML的文件输入流,以Element的形式获取XML的根,返回之 * @param inputStream 文件输入流 * @return ElementXML的根 */protected Element readXmlStream (InputStream inputStream) {......}/** * 用从一个XML的文件中读取的数据构建工厂 * @param root 从一个XML的文件中读取的数据的根 */protected abstract void buildFactory(Element root);}在实现这几个顶级函数的时候,我们还会将一些比较独立的功能分解出去,形成类与接口,比如这里的findXmlFile(),它可能会以各种方式去寻找XML文件,这时把这些功能提取出来,形成Resource接口和它的多个实现(如图1.1所示),为findXmlFile()所调用。如果我们将这个复杂的功能设计成这样,则毫无疑问,系统可读性将大大提高。
图1.1 工厂类模板的设计图
此外,在面向对象的世界里,我们设计的类、方法、关联,应当与现实世界中的事物、行为,及其相互的关系对应起来。现实世界有什么事物,这些事物都应当有什么行为,相互之间是什么关系,则我们在软件世界里就应当设计什么类、什么方法和它们之间的关联关系。只有这样的设计才是最易于为人所理解的设计,这就是“领域驱动设计”的思想[1]。在系统重构中,我们将使用“抽取方法”来分解难于阅读与维护的大函数,用“抽取对象”来分解无所不能的大对象。系统重构要干的另一件事情就是使软件易于维护、易于变更。软件需求总是变得越来越复杂,这是无法改变的客观事实。在添加新功能的同时,我们既要保证原有代码的有效性,又必须有效地复用原有的代码。这是多么矛盾的一件事儿啊!怎么办呢?看我在后面一步一步给你分解……[1] 领域驱动设计(DDD: Domain-DrivenDesign),源自软件理论大师Eric Evans在其2010年发表的同名著作中提出来的设计思想,本文将大量提及。