在论坛答了字符串分割的求助以后,第二天,那位求助者又问另一种字符串怎么分割,接着又给我短信问我第三种怎么分割。
我一想,这不是工厂模式嘛。有三种不同的需要分割的模式,用工厂模式,就能实现输入字符串即分割成需要的数据,而不用考虑格式问题。看来我的工厂模式基本熟练了。

using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;

namespace Date12241

...{

/**//// <summary>
/// 基本上,如果还有别的格式,可以自己添加继承子类
/// </summary>
public class SpiltStringNew

...{
protected string originalString;
public string GetOriginalString

...{

get ...{ return originalString; }

set ...{ originalString = value; }
}

protected string changedString;
public string GetChangedString

...{

get ...{ return changedString; }

set ...{ changedString = value; }
}

public ArrayList SpiltStr()

...{
string str = changedString;
ArrayList list = new ArrayList();
string str1 = "";
foreach (char c in str)

...{

if (c != '|')

...{
str1 += c.ToString();
}
else if (str1 != "")

...{
list.Add(str1);
str1 = "";
}
}
list.Add(str1);
return list;
}

public void SecondSpilt(string str, out string name, out string gender, out int age)

...{
int indexA = str.IndexOf("a");
int indexB = str.IndexOf("b");
name = str.Substring(0, indexA);
gender = str.Substring(indexA + 1, indexB - indexA - 1);
age = Int32.Parse(str.Substring(indexB + 1, str.Length - indexB - 1));
}

public virtual ArrayList FirstSpilt()

...{
ArrayList list = new ArrayList();
return list;
}


}

//标准分割:三a男b15 ¦ ¦李四a女b15
public class StandardFirstSpilt : SpiltStringNew

...{
public override ArrayList FirstSpilt()

...{
changedString = originalString;
ArrayList list = SpiltStr();
return list;
}
}

//“姓名张三性别男年龄15姓名李四性别女年龄15”中文切割记号的分割
public class ChineseFirstSpilt : SpiltStringNew

...{
public override ArrayList FirstSpilt()

...{
changedString = originalString.Replace("姓名", "||");
changedString = changedString.Replace("性别", "a");
changedString = changedString.Replace("年龄", "b");

ArrayList list = SpiltStr();
return list;
}

}

//张三a男b20李四a男b25钱五a女b18,没有“|”符号的切割。
public class NoMarkFirstSpilt : SpiltStringNew

...{
public override ArrayList FirstSpilt()

...{
string str1 = "";
ArrayList list = new ArrayList();
int ct = originalString.Length;
for (int i = 0; i < originalString.Length; i++)

...{
str1 += originalString[i];
if ((i == ct - 1)||Char.IsDigit(originalString, i)&&(!Char.IsDigit(originalString, i + 1)) )

...{
list.Add(str1);
str1 = "";
}
}
return list;
}
}

//工厂,选择哪种分割模式
public static class SpiltStringFactory

...{
public static SpiltStringNew CreateSpilt(string str)

...{
SpiltStringNew firstSpilt = null;
bool mark = false;
bool latter = false;
foreach (char c in str)

...{
if (c == '|')
mark = true;
else if (c == 'a')

...{
latter = true;
}
}

if (mark)

...{
firstSpilt = new StandardFirstSpilt();
}
else if (latter)

...{
firstSpilt = new NoMarkFirstSpilt();
}
else

...{
firstSpilt = new ChineseFirstSpilt();
}

firstSpilt.GetOriginalString = str;

return firstSpilt;
}
}

public class test

...{
public static void Main(String[] args)

...{
//这里可以用读取数据的方法代替。
string str = "姓名张三性别男年龄15姓名李四性别女年龄15";
SpiltStringNew spiltString = SpiltStringFactory.CreateSpilt(str);
ArrayList list = spiltString.FirstSpilt();

string name;
string gender;
int age;

foreach (object obj in list)

...{
//数据彻底分离
spiltString.SecondSpilt(obj.ToString(), out name, out gender, out age);

//打印。这里可以插入将name,gender,age,插入数据库的方法。
Console.WriteLine(name + " " + gender + " " + age);
}

Console.ReadLine();
}


}

}

