一、工厂模式
软件设计模式(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<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