package jdepend.knowledge.pattern.impl1; import java.util.ArrayList; import java.util.Collection; import jdepend.knowledge.pattern.PatternInfo; import jdepend.metadata.JavaClass; import jdepend.metadata.Method; import jdepend.model.JavaClassUnit; public final class FactoryMethodIdentifyer extends AbstractPatternIdentifyer { @Override public Collection<PatternInfo> identify(Collection<JavaClassUnit> javaClasses) { Collection<PatternInfo> rtn = new ArrayList<PatternInfo>(); Collection<JavaClass> superClasses; boolean found; Method factoryMethod; for (JavaClassUnit javaClass : javaClasses) { found = false; factoryMethod = null; // 计算存在父类的JavaClass superClasses = javaClass.getJavaClass().getSupers(); if (superClasses != null && superClasses.size() > 0) { // 查找工厂方法 L: for (Method method : javaClass.getJavaClass().getOverrideMethods()) { // 判断返回值是否是某一类型的父类,又不是所在的Class的父类 if (method.getReturnTypes().size() == 1) { for (JavaClass returnType : method.getReturnClassTypes()) { if (returnType.getSubClasses().size() > 0 && !javaClass.getJavaClass().getSupers().contains(returnType)) { found = true; factoryMethod = method; break L; } } } } } if (found) { rtn.add(new PatternInfo(javaClass.getJavaClass(), javaClass.getName() + "." + factoryMethod.getName())); } } return rtn; } @Override public String getExplain() { StringBuilder explain = new StringBuilder(); explain.append("    <strong>工厂模式</strong><br>"); explain.append("    1、存在父类;2、工厂方法覆盖了父类方法;3、返回类型有子类;4、返回类型只有一个;5、返回类型不是自己的父类。<br><br>"); return explain.toString(); } }