一共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,获取document
SAXReader saxReader = new SAXReader();//使用DOM4J工具
Document document = saxReader.read("src/day2/demo/ba3/beans.xml");
//获取根节点
Element rootElement = document.getRootElement();
//获取根下的bean
List<Element> allBeanElement = rootElement.elements("bean");
//遍历list
for (Element beanElement : allBeanElement) {
//获取bean中的属性
String id = beanElement.attributeValue("id");
String className = beanElement.attributeValue("className");
//创建BeanConfig,并且封装id和className
BeanConfig beanConfig = new BeanConfig();
beanConfig.setId(id);
beanConfig.setClassName(className);
//再获取bean下的子标签
List<Element> allProperty = beanElement.elements("property");
for (Element prop : allProperty) {
//获取属性:name value
String name = prop.attributeValue("name");
String value = prop.attributeValue("value");
//将name和value保存到BeanConfig
beanConfig.getProps().setProperty(name,value);
}//内存for
//将封装好的数据存放到map中
cache.put(id,beanConfig);
}//外层for
//测试
System.out.println("初始化数据:"+cache);
} catch(Exception e){
throw new RuntimeException(e);
}
}
//因为这是一个工厂,需要提供对象的方法 - 外面需要的时候可以通过这个方法来拿对象
//通过指定的beanId来获取相对应的BeanConfig
public static Object getBean(String beanId){
//创建beanId获取相应的BeanConfig
BeanConfig 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();//获取实例对象
//循环解析 - BeanUtils
for(String name:beanConfig.getProps().stringPropertyNames()){
//每遍历到一个name,就返回name对应的value
String value = beanConfig.getProps().getProperty(name);
//使用BeanUtils封装数据
BeanUtils.setProperty(obj,name,value);
}
return obj;
} catch (Exception e){
throw new RuntimeException(e);
}
}
}
}