一共23中设计模式

    常用的模式
    1、单例模式
    2、工厂模式
    3、代理模式
    4、模板模式

    工厂模式:相当于工厂的作用——流水线。创建出对象,之后如果需要用到这个对象,可以直接去工厂拿就行了。

    image.png

    1. <?xml version="1.0" encoding="utf-8" ?>
    2. <!-- xml中的标签名和属性名都可以自定义 -->
    3. <bean id="xx" className="zz">
    4. <property name="xml" value="xx">
    5. </property>
    6. </bean>
    7. <!-- 如果在xml中需要处理注释 - 注释过后的文件内容不会被解析,要将xml代码注释 -->
    8. <![CDATA[ .........]]>
    1. package day2.demo.ba3;
    2. import org.apache.commons.beanutils.BeanUtils;
    3. import org.dom4j.Document;
    4. import org.dom4j.Element;
    5. import org.dom4j.io.SAXReader;
    6. import org.junit.Test;
    7. import java.util.HashMap;
    8. import java.util.List;
    9. import java.util.Map;
    10. public class BeanFactory {
    11. //1.提供map存放beans.xml中的配置文件内容,使用map,建议使用静态处理 - 好处是只要加载一次
    12. private static Map<String,BeanConfig> cache = new HashMap<>();
    13. //静态代码块处理数据添加
    14. static{
    15. try{
    16. //加载xml,获取document
    17. SAXReader saxReader = new SAXReader();//使用DOM4J工具
    18. Document document = saxReader.read("src/day2/demo/ba3/beans.xml");
    19. //获取根节点
    20. Element rootElement = document.getRootElement();
    21. //获取根下的bean
    22. List<Element> allBeanElement = rootElement.elements("bean");
    23. //遍历list
    24. for (Element beanElement : allBeanElement) {
    25. //获取bean中的属性
    26. String id = beanElement.attributeValue("id");
    27. String className = beanElement.attributeValue("className");
    28. //创建BeanConfig,并且封装id和className
    29. BeanConfig beanConfig = new BeanConfig();
    30. beanConfig.setId(id);
    31. beanConfig.setClassName(className);
    32. //再获取bean下的子标签
    33. List<Element> allProperty = beanElement.elements("property");
    34. for (Element prop : allProperty) {
    35. //获取属性:name value
    36. String name = prop.attributeValue("name");
    37. String value = prop.attributeValue("value");
    38. //将name和value保存到BeanConfig
    39. beanConfig.getProps().setProperty(name,value);
    40. }//内存for
    41. //将封装好的数据存放到map中
    42. cache.put(id,beanConfig);
    43. }//外层for
    44. //测试
    45. System.out.println("初始化数据:"+cache);
    46. } catch(Exception e){
    47. throw new RuntimeException(e);
    48. }
    49. }
    50. //因为这是一个工厂,需要提供对象的方法 - 外面需要的时候可以通过这个方法来拿对象
    51. //通过指定的beanId来获取相对应的BeanConfig
    52. public static Object getBean(String beanId){
    53. //创建beanId获取相应的BeanConfig
    54. BeanConfig beanConfig = cache.get(beanId);
    55. //判断这个对象是不是合法
    56. if(beanConfig == null){
    57. throw new RuntimeException("获得的对象["+beanId+"]不存在");
    58. }else{
    59. //如果存在 - 通过反射机制进行获取
    60. try{
    61. String className = beanConfig.getClassName();
    62. Class cla = Class.forName(className);
    63. Object obj = cla.newInstance();//获取实例对象
    64. //循环解析 - BeanUtils
    65. for(String name:beanConfig.getProps().stringPropertyNames()){
    66. //每遍历到一个name,就返回name对应的value
    67. String value = beanConfig.getProps().getProperty(name);
    68. //使用BeanUtils封装数据
    69. BeanUtils.setProperty(obj,name,value);
    70. }
    71. return obj;
    72. } catch (Exception e){
    73. throw new RuntimeException(e);
    74. }
    75. }
    76. }
    77. }

    image.png