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;
    }
}
// 宾利车
public class BentleyCar extends Car {

    @Override
    public void run() {
        System.out.println("一辆价格为:" + getPrice() + "万" + getColor() + "的" + getBrand() + "正在冒着烟的跑>>>");
    }
}
// 法拉利
public class FerrariCar extends Car {

    @Override
    public void run() {
        System.out.println("一辆价格为:" + getPrice() + "万" + getColor() + "的" + getBrand() + "正在疯狂的跑>>>");
    }
}
//简单工厂类
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;
        }
    }
}

测试类:

public class MyTest {
    public static void main(String[] args) {
        //通过工厂创建对象
        Car binli = CarFactory.createCar("binli"); 
        binli.run();
        Car falali = CarFactory.createCar("falali");
        falali.run();
    }
}

在这里插入图片描述


2. 工厂方法模式



2. 抽象工厂模式



二、动态代理




三、XML文件


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

1. XML概述


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

    • 可扩展:标签都是自定义的,如 <user>、<student>、<bean>、<parent>、<dependencies>等等。
  • 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 version="1.0" encoding="UTF-8" ?>
  • 文档中有且仅有一个根标签。
  • 标签中可以定义属性,属性和标签名空格隔开,属性值必须使用引号引起来。(单双都可以,推荐用双引号)
  • 标签必须成对出现,有开始、有结束。(要成对标签、或者自闭合标签 ,如 <bean></bean><br/>
  • 标签名称区分大小写。
  • 标签需要正确嵌套。
  • xml文档中的注释: <!--注释内容-->。(同HTML写法)

在这里插入图片描述

在这里插入图片描述

3. XML的组成部分


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

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

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

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

<?xml-stylesheet type="text/css" href="a.css" ?> 

在这里插入图片描述


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

  • 定义规则:
    • 名称可以含字母、数字以及其他的字符。
    • 名称不能以数字或者标点符号开始。
    • 名称不能以字母xml(或者 XML、Xml等)开始。
    • 名称不能包含空格。
<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet type="text/css" href="a.css" ?>
<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>

4、属性:

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


5、文本:

  • CDATA区:在该区域中的数据会被原样展示。
  • 格式:<![CDATA[内容]]>
<?xml version="1.0" encoding="utf-8" ?>
<beans>
    <!--
        标签体中一些特殊符号需要使用转义字符
        如果大批量的使用转义字符太麻烦: 可以使用<![CDATA[ 含有特殊符号的额内容 ]]>
     -->
    <!-- <bean>3<2</bean> -->
    <bean>3&#60;2</bean>
    <![CDATA[3<2]]>
</beans>

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



4. XML文档约束


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

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


4.1 DTD约束

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

DTD约束快速入门:

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

<!--定义根标签students,可以有多个子标签student-->
<!ELEMENT students (student*) >

<!--在student标签中定义了name、age、gender标签,只能定义一次,使用时候必须按照顺序出现-->
<!ELEMENT student (name,age,gender) >

<!--定义name、age、gender标签,(#PCDATA)可以在标签体中写字符串内容,例如 <name>张三很帅</name>、<name>李四也不赖</name>-->
<!ELEMENT name (#PCDATA) >
<!ELEMENT age (#PCDATA) >
<!ELEMENT gender (#PCDATA) >

<!--student标签里面定义属性,属性名是number类型是ID(唯一标识),#REQUIRED必须出现 -->
<!ATTLIST student number ID #REQUIRED>

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

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

<?xml version="1.0" encoding="UTF-8" ?>

<!--引入内部dtd约束-->
<!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>123</age>
        <gender></gender>
    </student>
    <student number="stu02">
        <name>李四</name>
        <age>18</age>
        <gender></gender>
    </student>
</students>

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

  • 本地:<!DOCTYPE 根标签名 SYSTEM "dtd文件的位置">
  • 网络:<!DOCTYPE 根标签名 PUBLIC "dtd文件名字" "dtd文件的位置">
<?xml version="1.0" encoding="UTF-8" ?>

<!--引入外部dtd,引入之后便会有自定义dtd约束的语法提示-->
<!DOCTYPE students SYSTEM "student.dtd">

<students>
    <student number="stu01">
        <name>张三</name>
        <age>123</age>
        <gender></gender>
    </student>
    <student number="stu02">
        <name>李四</name>
        <age>18</age>
        <gender></gender>
    </student>
</students>


4.2 Schema约束

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

Schema约束快速入门:

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

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns="http://www.baidu.com/xml"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            targetNamespace="http://www.baidu.com/xml"
            elementFormDefault="qualified"> <!--qualified强制要求、unbounded不强制要求-->

    <!--定义根标签students,类型是自定义类型studenstType-->
    <xsd:element name="students" type="studenstType"/>

    <!--配置组合类型:studenstType-->
    <xsd:complexType name="studenstType">
        <!--sequence指定字标签顺序、扩展:choice选择、all任意-->
        <xsd:sequence>
            <!-- 根标签students里面可以有0个或者多个student子标签-->
            <xsd:element name="student" type="studentType" minOccurs="0" maxOccurs="unbounded"/>
        </xsd:sequence>
    </xsd:complexType>

    <!--配置组合类型:studentType-->
    <xsd:complexType name="studentType">
        <xsd:sequence>
            <!--在student标签中定义子标签name 类型是字符串-->
            <xsd:element name="name" type="xsd:string"/>
            <!--在student标签中定义子标签age 类型是自定义类型ageType-->
            <xsd:element name="age" type="ageType"/>
            <!--在student标签中定义子标签gender 类型是genderType-->
            <xsd:element name="gender" type="genderType"/>
        </xsd:sequence>

        <!--为student标签声明属性number,类型是自定义类型numberType,required必须配置-->
        <xsd:attribute name="number" type="numberType" use="required"/>
    </xsd:complexType>

    <!--配置简单类型:ageType-->
    <xsd:simpleType name="ageType">
        <!--对年龄进行限定 数据格式是数字integer-->
        <xsd:restriction base="xsd:integer">
            <!--范围-->
            <!--最小值0最大值256-->
            <xsd:minInclusive value="0"/>
            <xsd:maxInclusive value="256"/>
        </xsd:restriction>

    </xsd:simpleType>

    <!--配置简单类型:genderType-->
    <xsd:simpleType name="genderType">
        <!--对性别进行限定 数据格式是字符串-->
        <xsd:restriction base="xsd:string">
            <!--性别只能是:男、女-->
            <xsd:enumeration value="male"/>
            <xsd:enumeration value="female"/>
        </xsd:restriction>
    </xsd:simpleType>

    <!--配置简单类型:numberType-->
    <xsd:simpleType name="numberType">
        <!--对年龄进行限定 数据格式是字符串-->
        <xsd:restriction base="xsd:string">
            <!--number以stu_开头,后面还要添加四位数字-->
            <xsd:pattern value="stu_\d{4}"/>
        </xsd:restriction>
    </xsd:simpleType>

</xsd:schema>

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

<?xml version="1.0" encoding="UTF-8" ?>

<!--
引入schema约束格式:
          <根标签 前缀:
                    1、 引入xsi前缀,  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" (官方文档的位置)
                    2、 引入xsd文件命名空间, xsi:schemaLocation="命名空间  xsd文件具体位置"
                    3、 为每个xsd约束声明一个前缀,作为标识, xmlns="http://www.baidu.com/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>0</age>-->
        <age>18</age>
        <gender>male</gender>
    </student>

    <student number="stu_1002">
        <name>李四</name>
        <!--<age>300</age>-->
        <age>101</age>
        <gender>female</gender>
        <!--<gender>女</gender>-->
    </student>

</students>

扩展:

在这里插入图片描述




5. XML解析


  • Dom4J解析XML文件
  • Xpath
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白豆五

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值