一共23中设计模式
常用的模式
1、单例模式
2、工厂模式
3、代理模式
4、模板模式
工厂模式:相当于工厂的作用——流水线。创建出对象,之后如果需要用到这个对象,可以直接去工厂拿就行了。

<?xml version="1.0" encoding="utf-8" ?><!-- xml中的标签名和属性名都可以自定义 --><bean id="xx" className="zz"><property name="xml" value="xx"></property></bean><!-- 如果在xml中需要处理注释 - 注释过后的文件内容不会被解析,要将xml代码注释 --><![CDATA[ .........]]>
package day2.demo.ba3;import org.apache.commons.beanutils.BeanUtils;import org.dom4j.Document;import org.dom4j.Element;import org.dom4j.io.SAXReader;import org.junit.Test;import java.util.HashMap;import java.util.List;import java.util.Map;public class BeanFactory {//1.提供map存放beans.xml中的配置文件内容,使用map,建议使用静态处理 - 好处是只要加载一次private static Map<String,BeanConfig> cache = new HashMap<>();//静态代码块处理数据添加static{try{//加载xml,获取documentSAXReader saxReader = new SAXReader();//使用DOM4J工具Document document = saxReader.read("src/day2/demo/ba3/beans.xml");//获取根节点Element rootElement = document.getRootElement();//获取根下的beanList<Element> allBeanElement = rootElement.elements("bean");//遍历listfor (Element beanElement : allBeanElement) {//获取bean中的属性String id = beanElement.attributeValue("id");String className = beanElement.attributeValue("className");//创建BeanConfig,并且封装id和classNameBeanConfig beanConfig = new BeanConfig();beanConfig.setId(id);beanConfig.setClassName(className);//再获取bean下的子标签List<Element> allProperty = beanElement.elements("property");for (Element prop : allProperty) {//获取属性:name valueString name = prop.attributeValue("name");String value = prop.attributeValue("value");//将name和value保存到BeanConfigbeanConfig.getProps().setProperty(name,value);}//内存for//将封装好的数据存放到map中cache.put(id,beanConfig);}//外层for//测试System.out.println("初始化数据:"+cache);} catch(Exception e){throw new RuntimeException(e);}}//因为这是一个工厂,需要提供对象的方法 - 外面需要的时候可以通过这个方法来拿对象//通过指定的beanId来获取相对应的BeanConfigpublic static Object getBean(String beanId){//创建beanId获取相应的BeanConfigBeanConfig beanConfig = cache.get(beanId);//判断这个对象是不是合法if(beanConfig == null){throw new RuntimeException("获得的对象["+beanId+"]不存在");}else{//如果存在 - 通过反射机制进行获取try{String className = beanConfig.getClassName();Class cla = Class.forName(className);Object obj = cla.newInstance();//获取实例对象//循环解析 - BeanUtilsfor(String name:beanConfig.getProps().stringPropertyNames()){//每遍历到一个name,就返回name对应的valueString value = beanConfig.getProps().getProperty(name);//使用BeanUtils封装数据BeanUtils.setProperty(obj,name,value);}return obj;} catch (Exception e){throw new RuntimeException(e);}}}}

