单例模式、简单工厂模式、XML解析
单例模式:
什么是单例模式?
针对特定问题提出的特定解决方案
为什么使用设计模式?
让程序有更好的可扩展性
在哪里使用?
一般情况下,开发中真正使用设计模式的地方,JVM(虚拟机)底层机制模式
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Day08单例 {
//Play类 public class Play { //构造 private Play() { }
private static Play play;
public static Play PlayOnlyOne(){ if(play==null){ play=new Play(); } return play; } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Day08单例 { class Program { static void Main(string[] args) { Play p1 = Play.PlayOnlyOne(); Play p2 = Play.PlayOnlyOne(); Console.WriteLine(p1==p2); Console.ReadLine(); } } }
单例模式:一个类在内存中只能有一个对象(条件)
1.类的构造设为私有的
//构造 private Play() { }
2.定义一个私有的静态的的类类型变量
private static Play play;
3.公有的静态的方法并且返回值类型为类类型的方法
public static Play PlayOnlyOne(){ if(play==null){ play=new Play(); } return play; }
简单工厂模式:
简单工厂模式是类的创建模式,根据提供给它的数据返回几个可能类中的一个类的实例。
优点:工程类中包含了必要地逻辑判断,根据客户端的选择条件动态实例化相关的类,对客户端来说,去除了与具体产品的依赖
简单工厂模式关系图:
下面是一个关于加减乘除运算的简单工厂模式
定义一个父类:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Sj4 { public class Operation { public double Number1 { get; set; } public double Number2 { get; set; } public virtual double Reault() { double result = 0; return result; } } }
子类,分别用来计算加减乘除
加法:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Sj4 { public class OperationAdd:Operation { public override double Reault() { double result = Number1 + Number2; return result; } }
}
//除法
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Sj4 { public class OperationDiv:Operation { public override double Reault() { if(Number2==0){ throw new Exception("除数不能为0!"); } double result = Number1 / Number2; return result; } } }
(减法、乘法同样方法)
将判断选择的是加减乘除的方法提取到一个类中。(为什么要提取到一类中呢?在你使用时不可能只有一个页面要用到相同的方法,为了避免代码的冗余,所以提取到一个类中)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Sj4 { public class OperationFactory { public static Operation Gettance(string type){ Operation op = null; switch (type) { case "+": { op = new OperationAdd(); break; } case "-": { op = new OperationReduce(); break; } case "*": { op = new OperationRide(); break; } case "/": { op = new OperationDiv(); break; } } return op; } } }
在选择时调用这个方法
Operation operation= OperationFactory.Gettance(type);
XML解析
XML称为可扩展标记性语言,是eXtensible Markup Language的缩写。在.NET框架中XML是非常重要的一部分,他用于描述数据、是当前处理结构化文档信息的有力工具
操作XML的对象属性和方法
对象 | 属性和方法 | 说明 |
XmlDocument | DocumentElement属性 | 获取根节点 |
ChildNodes属性 | 获取所有子节点 | |
Load()方法 | 读取整个XML的结构 | |
XmlNode | InnerText属性 | 当前节点的值 |
Name属性 | 当前节点的名称 | |
ChildNodes属性 | 当前节点的所有子节点 |
<?xml version="1.0" encoding="utf-8" ?> <Books> <Book> <Bookid>101</Bookid> <BookName>hah</BookName> <BookAnthor>lala</BookAnthor> </Book> <Book> <Bookid>102</Bookid> <BookName>hoho</BookName> <BookAnthor>xixi</BookAnthor> </Book> <Book> <Bookid>103</Bookid> <BookName>dudu</BookName> <BookAnthor>bubu</BookAnthor> </Book> </Books>
<?xml version="1.0" encoding="utf-8" ?>是XML声明,version:文档符合XML1.0规范
encoding:文档字符编码,默认utf-8
解析XML文件
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml; namespace Sj1 { class Program { static void Main(string[] args) {
XmlDocument myXml = new XmlDocument(); myXml.Load("Book.xml"); //读取指定XML文件 XmlNode mynode = myXml.DocumentElement; //读取XML根节点 foreach(XmlNode node in mynode.ChildNodes){ //对子节点进行循环
//将子节点的内容显示出来 Console.WriteLine(node["Bookid"].InnerText + " " + node["BookName"].InnerText + " " + node["BookAnthor"].InnerText); } Console.ReadLine(); } } }
注意:一个xml文件只能有一个根节点
XmlElement继承XmlLinkeNode,XmlLinkeNode继承XmlNode
XmlNode是XmlElement爷爷