设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是它能被广泛应用的原因。简单说:
模式:在某些场景下,针对某类问题的某种通用的解决方案。
1.单例设计模式
懒汉式
饿汉式
double checking
详见博文https://blog.csdn.net/wangdongli_1993/article/details/80972188
2.代理模式
现实生活中的代理(比如租房子张中介代理,那么你是真实角色,是你要租房子,而中介公式是代理角色,你们有共同的约定),代理模式要求真实角色和代理角色实现同一个接口。
第二种线程创建方式 线程类实现Runnable接口,线程类就是真实角色。Thread是代理角色,也实现了Runnable接口,这就是代理模式,由Thread类中的start(),代理你完成线程的启动调用
3.工厂模式
在手写服务器时,学到的解析xml语言就用到工厂模式,解析xml语言,学习了基于流的SAX解析方式 对于xml文件内容,一条一条的分析。
这是一个简单的xml文件,写入了两个Person对象,要解析,要有对应的Person类
<?xml version="1.0" encoding="utf-8" ?>
<persons>
<person>
<name>"嫦娥"</name>
<age>9000</age>
</person>
<person>
<name>"猪八戒"</name>
<age>10100</age>
</person>
</persons>
所以,定义Person类,一个简单的JAVABEAN类
package xml;
public class Person {
private String name;
private int age;
public Person(){
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
写xml解析类
package xml;
import java.util.ArrayList;
import java.util.List;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/**
* 继承DefaultHandler类,重写五个方法
* startDocument()
* startElement(String uri, String localName, String qName,
Attributes attributes)
qName 就是xml文件中的成对的标签名称
characters(参数) 对成对标签的中的值进行获取,
* endElement(参数) endDocument()
* @author Administrator
*
*/
private List<Person> persons;
private Person person;
private String tag;
@Override
public void startDocument() throws SAXException {
//System.out.println("处理文档开始");
persons=new ArrayList<Person>();
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
System.out.println("处理元素开始"+qName);
if(qName!=null){
tag=qName;
}
if(qName!=null&&qName.equals("person")){
person=new Person();
}
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
String str=new String(ch,start,length);
if(tag!=null&&tag.equals("name")){
person.setName(str);
}
else if(tag!=null&&tag.equals("age")){
person.setAge(Integer.valueOf(str));
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
System.out.println("处理一个元素结束"+qName);
if(qName!=null&&qName.equals("person"))
{
persons.add(person);
}
tag=null;
}
@Override
public void endDocument() throws SAXException {
//System.out.println("处理文档结束");
}
public List<Person> getPersons() {
return persons;
}
public void setPersons(List<Person> persons) {
this.persons = persons;
}
}
最后是应用,处理xml文件
package xml;
import java.io.IOException;
import java.util.List;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
//工厂模式
public class ParseDemo01 {public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
// 获取解析工厂 SAXParserFactory 抽象类 .newInstance()创建对象
SAXParserFactory factory=SAXParserFactory.newInstance();//从解析工厂获取解析器
SAXParser parse=factory.newSAXParser();//加载文档 注册处理器 获取xml文件
Thread.currentThread().getContextClassLoader().
getResourceAsStream("xml/Person.xml")
//编写处理器 就是上面写好的解析类
PersonHandler ph=new PersonHandler();
parse.parse(Thread.currentThread().getContextClassLoader().
getResourceAsStream("xml/Person.xml"), ph);
List<Person> persons=ph.getPersons();
for(Person p:persons){
System.out.println(p.getName()+"--->"+p.getAge());
}
}
}