Simple Factory Pattern
基类:
public class Namer {
//parts stored here
protected string frName, lName;
//return first name
public string Frname
{
get{return frName;}
}
//return last name
public string Lname {
get{return lName;}
}
}
继承自Namer的子类://parts stored here
protected string frName, lName;
//return first name
public string Frname
{
get{return frName;}
}
//return last name
public string Lname {
get{return lName;}
}
}
public class FirstFirst : Namer
{
public FirstFirst(string name)
{
int i = name.IndexOf (" ");
if(i > 0) {
frName = name.Substring (0, i).Trim ();
lName = name.Substring (i + 1).Trim ();
}
else {
lName = name;
frName = "";
}
}
}
如果输入的字符串中含有空格,那么前一部分就是firstname,后面一部分就是lastname.{
public FirstFirst(string name)
{
int i = name.IndexOf (" ");
if(i > 0) {
frName = name.Substring (0, i).Trim ();
lName = name.Substring (i + 1).Trim ();
}
else {
lName = name;
frName = "";
}
}
}
注意判断的方法写是在构造函数中,这样在实例化的时候就会自动调用它,做出判断得到结果。(结果是更改属性 firname和lastname)
public class LastFirst : Namer
{
public LastFirst(string name) {
int i = name.IndexOf (",");
if(i > 0) {
lName = name.Substring (0, i);
frName = name.Substring (i + 1).Trim ();
}
else {
lName = name;
frName = "";
}
}
}
{
public LastFirst(string name) {
int i = name.IndexOf (",");
if(i > 0) {
lName = name.Substring (0, i);
frName = name.Substring (i + 1).Trim ();
}
else {
lName = name;
frName = "";
}
}
}
如果输入的字符串中含有逗号,那么后一部分就是firstname,前一部分就是lastname.
这时候 “工厂类” 出场了,请看:
public class NameFactory {
public NameFactory() {}
public Namer getName(string name) {
int i = name.IndexOf (",");
if(i > 0)
return new LastFirst (name);
else
return new FirstFirst (name);
}
}
public NameFactory() {}
public Namer getName(string name) {
int i = name.IndexOf (",");
if(i > 0)
return new LastFirst (name);
else
return new FirstFirst (name);
}
}
注意这个工厂类只有一个“方法”是值得我们关注的,这个方法的返回类型 是Namer,也就是要返回一个Namer类的实例,下面我们看看方法体里的内容,如果用户输入的字符串中含有“,”号,那么就返回一个LastFirst类的实例,否则返回一个FirstFirst类的实例。在new出一个新的object的时候需要调用构造函数,而我们在构造函数中已经作出了判断,可以得到并更改继承得来的2个字段的值。
下面我们来看一下我们程序运行的界面:
当用户输入字符串以后,单击compute按钮 时,我们就可以让工厂类来决定实例化哪一个类,在实例化的时候调用构造函数,做出判断得到字段frName, lName的值,并显示在UI上。
下面我们来看事件处理函数:
private void btCompute_Click(object sender, System.EventArgs e) {
//由工厂类得到一个FirstFirs类的实例还是LastFirst的实例
Namer nm = nameFact.getName (txName.Text );
//读取做出判断以后的成员变量的值(通过属性来读)并赋值给TEXTBOX的TEXT属性
txFirst.Text = nm.Frname;
txLast.Text = nm.Lname;
}
//由工厂类得到一个FirstFirs类的实例还是LastFirst的实例
Namer nm = nameFact.getName (txName.Text );
//读取做出判断以后的成员变量的值(通过属性来读)并赋值给TEXTBOX的TEXT属性
txFirst.Text = nm.Frname;
txLast.Text = nm.Lname;
}
注意由于不能确定到底是实例化哪一个类,我们在要声明的时候注意到他们共同的父类的类型可以用做声明时的对象的类型。这是一个需要注意的地方。
本demo是《C#设计模式》一书提供的。我在此只是想写出些自己的看法来,希望那些想学好设计模式的人加加油。包括我自己:)