• Java笔记(工厂模式、动态代理、XML)


    一、工厂模式


    软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的复用性。

    什么是工厂设计模式

    我们之前创建对象都是自己手动new出来的,那能不能让一个工厂帮我们造出来,然后我们直接拿来用就行。(使用new的方式创建对象会增加耦合度,无论使用什么框架, 都要减少new的使用以降低耦合度)

    工厂模式(Factory Pattern)是Java中最常用的设计模式之一,这种类型的设计模式属于创建型模式,它提供了一种获取对象的方式。

    工厂模式的作用:工厂的方法可以封装对象的创建细节( 比如 为该对象进行加工和数据注入)、可以实现类与类之间的解耦操作(核心思想)。


    1. 简单工厂模式


    简单工厂(Simple Factory),它把实例化的操作单独放到一个类中,这个类就成为简单工厂类,让简单工厂类来决定应该用哪个具体子类来实例化。这样让使用者只需要关注自己需要的,而不需要关注这个东西是怎么创建的,直接拿来用就行。

    在这里插入图片描述

    // 抽象父类
    public abstract class Car {
        private String brand; // 品牌
        private String color; // 颜色
        private int price;    // 价格
    
        //跑
        public abstract void run();
    
    
        public Car(String brand, String color, int price) {
            this.brand = brand;
            this.color = color;
            this.price = price;
        }
    
        public Car() {
        }
    
        public String getBrand() {
            return brand;
        }
    
        public void setBrand(String brand) {
            this.brand = brand;
        }
    
        public String getColor() {
            return color;
        }
    
        public void setColor(String color) {
            this.color = color;
        }
    
        public int getPrice() {
            return price;
        }
    
        public void setPrice(int price) {
            this.price = price;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    // 宾利车
    public class BentleyCar extends Car {
    
        @Override
        public void run() {
            System.out.println("一辆价格为:" + getPrice() + "万" + getColor() + "的" + getBrand() + "正在冒着烟的跑>>>");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    // 法拉利
    public class FerrariCar extends Car {
    
        @Override
        public void run() {
            System.out.println("一辆价格为:" + getPrice() + "万" + getColor() + "的" + getBrand() + "正在疯狂的跑>>>");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    //简单工厂类
    public class CarFactory {
    
    
        /**
         * 静态方法:通过指定类型创建汽车对象
         *
         * @param msg 汽车类型
         * @return 抽象类Car的子类对象
         */
        public static Car createCar(String msg) {
            switch (msg) {
                case "binli":
                    Car binli = new BentleyCar();
                    binli.setBrand("宾利XXX");
                    binli.setColor("黑色");
                    binli.setPrice(400);
                    return binli;
                case "falali":
                    Car falali = new FerrariCar();
                    falali.setBrand("法拉利拉法");
                    falali.setColor("红色");
                    falali.setPrice(500);
                    return falali;
                default:
                    System.out.println("对不起该工厂无法完成此车的创建。");
                    return null;
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    测试类:

    public class MyTest {
        public static void main(String[] args) {
            //通过工厂创建对象
            Car binli = CarFactory.createCar("binli"); 
            binli.run();
            Car falali = CarFactory.createCar("falali");
            falali.run();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述


    2. 工厂方法模式



    2. 抽象工厂模式



    二、动态代理




    三、XML文件


    首先xml和properties都是文本文件,里面存的内容都是用来做配置的,可以被读取出来 。其次xml比properties功能更加丰富、结构更加清晰(使用标签,类似html)、还能嵌套使用、自定义标签等等。

    1. XML概述


    • XML(全称:EXtensible Markup Language),可扩展标记语言。

      • 可扩展:标签都是自定义的,如 等等。
    • XML 它是一种标记语言,很类似 HTML,标签都是自定义的。(但是HTML就不能用自定义的标签)

    • XML的作用:用于进行存储数据和传输数据、作为软件的配置文件。

    • XML的版本:W3C(万维网联盟)在1998年2月发布1.0版本,2004年2月又发布1.1版本,但是1.1版本不能向下兼容1.0版本,所以1.1版本就没有人用。同时,在2004年2月W3C又发布了1.0版本的第三版。所以到现在用的还是1.0版本。


    2. XML基本语法


    • xml文档的后缀名是.xml
    • 声明必须是第一行,即
    • 文档中有且仅有一个根标签。
    • 标签中可以定义属性,属性和标签名空格隔开,属性值必须使用引号引起来。(单双都可以,推荐用双引号)
    • 标签必须成对出现,有开始、有结束。(要成对标签、或者自闭合标签 ,如
    • 标签名称区分大小写。
    • 标签需要正确嵌套。
    • xml文档中的注释: 。(同HTML写法)

    在这里插入图片描述

    在这里插入图片描述

    3. XML的组成部分


    组成部分:文档声明、指令、标签、属性、文本。

    1、文档声明:(写在xml文档的第一行)

    • 格式 : ,例如
    • 属性列表:
      • version:版本号,该属性是必须存在的。
      • encoding:编码方式,告诉解析引擎当前文档使用的字符集。(如果不指定编码,默认是IOS-8859-1,IDEA会自动生成UTF-8编码所以这块不用管)
      • standalone:是否独立,yes不依赖其他文件,no依赖其他文件。
    
    
    • 1

    2、指令(了解):结合css的。

     
    
    • 1

    在这里插入图片描述


    3、标签:标签名称自定义的。

    • 定义规则:
      • 名称可以含字母、数字以及其他的字符。
      • 名称不能以数字或者标点符号开始。
      • 名称不能以字母xml(或者 XML、Xml等)开始。
      • 名称不能包含空格。
    
    
    <beans>
        <bean name="User" id="b001">大家好今天没喝bean>
        <bean name="Person" id="b001">
            <property name="username" value="root">一切都好property>
        bean>
        <resource href="www.good.com"/>
        <person>person>
        <student>student>
    beans>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    4、属性:

    • 属性是元素的一部分,它必须出现在元素的开始标签中。
    • 属性的定义格式:属性名="属性值",其中属性值必须使用单引或双引。
    • 一个元素可以有0~N个属性,但一个元素中不能出现同名属性
    • 属性名不能使用空格、冒号等特殊字符,且必须以字母开头
      <bean name="User" id="b001">大家好今天没喝bean>
    
    • 1


    5、文本:

    • CDATA区:在该区域中的数据会被原样展示。
    • 格式:
    
    <beans>
        
        
        <bean>3<2bean>
        
    beans>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    转义字符:
    在这里插入图片描述



    4. XML文档约束


    文档约束: 用来限定xml文件中的标签以及属性应该怎么写。(约定大于配置)

    xml文档约束有两种:DTD(文件后缀名.dtd)、Schema(文件后缀名.xsd)。


    4.1 DTD约束

    dtd约束的优缺点:可以约束xml文件的编写,不能约束具体的数据类型。

    DTD约束快速入门:

    1、编写dtd约束文档:(文件名student.dtd)

    
    <!ELEMENT students (student*) >
    
    
    <!ELEMENT student (name,age,gender) >
    
    
    <!ELEMENT name (#PCDATA) >
    <!ELEMENT age (#PCDATA) >
    <!ELEMENT gender (#PCDATA) >
    
    
    <!ATTLIST student number ID #REQUIRED>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    2、引入dtd文档到xml文档中。

    (1)内部dtd:将约束规则定义在xml文档中。

    
    
    
    DOCTYPE students [
            <!ELEMENT students (student*) >
            <!ELEMENT student (name,age,gender) >
            <!ELEMENT name (#PCDATA) >
            <!ELEMENT age (#PCDATA) >
            <!ELEMENT gender (#PCDATA) >
            <!ATTLIST student number ID #REQUIRED>
            ]>
    
    <students>
        <student number="stu01">
            <name>张三name>
            <age>123age>
            <gender>gender>
        student>
        <student number="stu02">
            <name>李四name>
            <age>18age>
            <gender>gender>
        student>
    students>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    (2)外部dtd:将约束规则定义在外部的dtd文件中。

    • 本地:
    • 网络:
    
    
    
    DOCTYPE students SYSTEM "student.dtd">
    
    <students>
        <student number="stu01">
            <name>张三name>
            <age>123age>
            <gender>gender>
        student>
        <student number="stu02">
            <name>李四name>
            <age>18age>
            <gender>gender>
        student>
    students>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17


    4.2 Schema约束

    4.2 Schema([ˈskiːmə]):可以约束XML文件的标签内容格式,以及具体的数据类型(type属性)。本身自己也是xml文件,格式更严谨。

    Schema约束快速入门:

    1、编写Schema约束文档:(student.xsd)

    
    <xsd:schema xmlns="http://www.baidu.com/xml"
                xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                targetNamespace="http://www.baidu.com/xml"
                elementFormDefault="qualified"> 
    
        
        <xsd:element name="students" type="studenstType"/>
    
        
        <xsd:complexType name="studenstType">
            
            <xsd:sequence>
                
                <xsd:element name="student" type="studentType" minOccurs="0" maxOccurs="unbounded"/>
            xsd:sequence>
        xsd:complexType>
    
        
        <xsd:complexType name="studentType">
            <xsd:sequence>
                
                <xsd:element name="name" type="xsd:string"/>
                
                <xsd:element name="age" type="ageType"/>
                
                <xsd:element name="gender" type="genderType"/>
            xsd:sequence>
    
            
            <xsd:attribute name="number" type="numberType" use="required"/>
        xsd:complexType>
    
        
        <xsd:simpleType name="ageType">
            
            <xsd:restriction base="xsd:integer">
                
                
                <xsd:minInclusive value="0"/>
                <xsd:maxInclusive value="256"/>
            xsd:restriction>
    
        xsd:simpleType>
    
        
        <xsd:simpleType name="genderType">
            
            <xsd:restriction base="xsd:string">
                
                <xsd:enumeration value="male"/>
                <xsd:enumeration value="female"/>
            xsd:restriction>
        xsd:simpleType>
    
        
        <xsd:simpleType name="numberType">
            
            <xsd:restriction base="xsd:string">
                
                <xsd:pattern value="stu_\d{4}"/>
            xsd:restriction>
        xsd:simpleType>
    
    xsd:schema>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65

    2、引入schame约束文档到xml中。

    
    
    
    
    <students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://www.baidu.com/xml student.xsd"
              xmlns="http://www.baidu.com/xml">
    
        <student number="stu_1001">
            <name>张三name>
            
            <age>18age>
            <gender>malegender>
        student>
    
        <student number="stu_1002">
            <name>李四name>
            
            <age>101age>
            <gender>femalegender>
            
        student>
    
    students>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    扩展:

    在这里插入图片描述




    5. XML解析


    • Dom4J解析XML文件
    • Xpath
  • 相关阅读:
    vue实现预览编辑ppt、word、pdf、excel、等功能的解决方案(内网-前端)
    Aqara秋季品鉴会众新品亮相 空间智能全面进化
    Java锁lock的应用
    【C语言】数组和指针刷题练习
    AR 和 VR 的开源平台
    树莓派镜像太大烧不进tf卡缩小img镜像缩小镜像缩小.img文件的方法
    ros中对move_base的调用
    jmeter接口自动化部署jenkins教程详解
    uniapp 分享到朋友圈
    Trie思想及模板
  • 原文地址:https://blog.csdn.net/qq_46921028/article/details/127987866