private static Paoding implMake(final Properties p) {
		// 将要返回的Paoding对象，它可能是新创建的，也可能使用paodingHolder中已有的Paoding对象
		Paoding paoding;
		// 作为本次返回的Paoding对象在paodingHolder中的key，使之后同样的key不会重复创建Paoding对象
		final Object paodingKey;
		// 如果该属性对象是通过PaodingMaker由文件读入的，则必然存在paoding.dic.properties.path属性
		// 详细请参考loadProperties方法)
		String path = p.getProperty("paoding.dic.properties.path");
		// 如果该属性由文件读入，则文件地址作为Paoding对象在paodingHolder中的key
		if (path != null) {
			paodingKey = path;
			// 否则以属性文件作为其key，之后只要进来的是同一个属性对象，都返回同一个Paoding对象
		} else {
			paodingKey = p;
		}
		paoding = (Paoding) paodingHolder.get(paodingKey);
		if (paoding != null) {
			return paoding;
		}
		try {
			paoding = createPaodingWithKnives(p);
			final Paoding finalPaoding = paoding;
			//
			String compilerClassName = getProperty(p,
					Constants.ANALYZER_DICTIONARIES_COMPILER);
			Class compilerClass = null;
			if (compilerClassName != null) {
				compilerClass = Class.forName(compilerClassName);
			}
			if (compilerClass == null) {
				String analyzerMode = getProperty(p, Constants.ANALYZER_MODE);
				if ("most-words".equalsIgnoreCase(analyzerMode)
						|| "default".equalsIgnoreCase(analyzerMode)) {
					compilerClass = MostWordsModeDictionariesCompiler.class;
				} else {
					compilerClass = SortingDictionariesCompiler.class;
				}
			}
			final DictionariesCompiler compiler = (DictionariesCompiler) compilerClass
					.newInstance();
			new Function() {
				public void run() throws Exception {
					// 编译词典-对词典进行可能的处理，以符合分词器的要求
					if (compiler.shouldCompile(p)) {
						Dictionaries dictionaries = readUnCompiledDictionaries(p);
						Paoding tempPaoding = createPaodingWithKnives(p);
						setDictionaries(tempPaoding, dictionaries);
						compiler.compile(dictionaries, tempPaoding, p);
					}

					// 使用编译后的词典
					final Dictionaries dictionaries = compiler
							.readCompliedDictionaries(p);
					setDictionaries(finalPaoding, dictionaries);

					// 启动字典动态转载/卸载检测器
					// 侦测时间间隔(秒)。默认为60秒。如果设置为０或负数则表示不需要进行检测
					String intervalStr = getProperty(p,
							Constants.DIC_DETECTOR_INTERVAL);
					int interval = Integer.parseInt(intervalStr);
					if (interval > 0) {
						dictionaries.startDetecting(interval,
								new DifferenceListener() {
									public void on(Difference diff)
											throws Exception {
										dictionaries.stopDetecting();
										// 此处调用run方法，以当检测到**编译后**的词典变更/删除/增加时，
										// 重新编译源词典、重新创建并启动dictionaries自检测
										run();
									}
								});
					}
				}
			}.run();
			// Paoding对象创建成功！此时可以将它寄放到paodingHolder中，给下次重复利用
			paodingHolder.set(paodingKey, paoding);
			return paoding;
		} catch (Exception e) {
			throw new PaodingAnalysisException("", e);
		}
	}