简单工厂模式[不属于23设计模式中]但做为23种设计模式开幕篇来了解模式是很不错的.
我们现来了解一下简单工厂模式如下图中GetInfo是一个基类,Str_Class类和Num_Class类从GetInfo类派生出来, GetObject类根据给出的的参数决定返回那一个子类.在GetObject中定义了一个GetUserInfo方法如果传的是字符型将会调Str_Class的实例,返回那一个实例完全取决于工厂,工厂功能可能复杂,但通常都是相当简单的.
接下来我们看一个C#例子,一个输入窗体,允许输入用户名或ID,都可以查出用户信息.通过判断输入的是字符还是整型,来显示信息.
这是一个很容易的判断,可以在类中用一个简单的if语句实现,但我们用来介绍工厂的工作方式以及工厂生成的对象.定义一个类,用构造函数接收姓名或ID,并且从类中取回用户信息.这个基类中没有定义构造函数.
public
class
GetInfo
...
{
protected string StrUserName,StrSex,StrAge,StrTel,StrAddr;
public GetInfo()...{}
public string GetStrUsername()
...{
return StrUserName;
}
public string GetStrSex()
...{
return StrSex;
}
public string GetStrAge()
...{
return StrAge;
}
public string GetStrTel()
...{
return StrTel;
}
public string GetStrAddr()
...{
return StrAddr;
}
}
接下来写两个派生类,实现了接口,在Str_Class类的构造函数中根据传入的姓名查出用户信息并赋给从基类继承过来变量
public
class
Str_Class:GetInfo
...
{
SqlConnection con=new SqlConn().Conn();
public Str_Class(string strName)
...{
try
...{
string strSql="select * from userinfo where username='"+strName+"'";
SqlDataAdapter da=new SqlDataAdapter(strSql,con);
DataSet ds=new DataSet();
da.Fill(ds,"DefaultTable");
StrUserName=ds.Tables[0].Rows[0][1].ToString();
StrSex=ds.Tables[0].Rows[0][2].ToString();
StrAge=ds.Tables[0].Rows[0][3].ToString();
StrTel=ds.Tables[0].Rows[0][4].ToString();
StrAddr=ds.Tables[0].Rows[0][5].ToString();
}
catch(Exception Err)
...{
throw Err;
}
}
}
在Num_Class类的构造函数中根据传入的ID查出用户信息并赋给从基类继承过来变量
public
class
Num_Class:GetInfo
...
{
SqlConnection con=new SqlConn().Conn();
public Num_Class(int id)
...{
try
...{
string strSql="select * from userinfo where id="+id+"";
SqlDataAdapter da=new SqlDataAdapter(strSql,con);
DataSet ds=new DataSet();
da.Fill(ds,"DefaultTable");
StrUserName=ds.Tables[0].Rows[0][1].ToString();
StrSex=ds.Tables[0].Rows[0][2].ToString();
StrAge=ds.Tables[0].Rows[0][3].ToString();
StrTel=ds.Tables[0].Rows[0][4].ToString();
StrAddr=ds.Tables[0].Rows[0][5].ToString();
}
catch(Exception Err)
...{
throw Err;
}
}
}
现在写工厂类.只检测传入是字符型还是整型,然后返回其中一个实例.
public
class
GetObject
...
{
public GetObject()...{}
public GetInfo GetUserInfo(string str)
...{
bool isbool=false;
Encoding encoding_Ascii=Encoding.ASCII;
byte[] byt=encoding_Ascii.GetBytes(str);
int num=0;
foreach(byte strr in byt)
...{
if(strr>58 || strr<47)
...{
isbool=true;
}
else if(isbool==false)
...{
num=Convert.ToInt32(str);
}
}
if(isbool==false)
return new Num_Class(num);
else
return new Str_Class(str);
}
}
最后将上述的部分组合在一起
private
void
button1_Click(
object
sender, System.EventArgs e)
...
{
try
...{
GetInfo obj=new GetObject().GetUserInfo(this.textBox1.Text.Trim());
this.txtName.Text=obj.GetStrUsername();
this.txtSex.Text=obj.GetStrSex();
this.txtTel.Text=obj.GetStrTel();
this.txtAge.Text=obj.GetStrAge();
this.txtAddr.Text=obj.GetStrAddr();
}
catch(Exception Err)
...{
MessageBox.Show(Err.Message);
}
}
源码下载地址:
本文介绍简单工厂模式的应用,通过一个C#示例展示如何根据输入类型(字符串或整数)选择不同的类实例来获取用户信息。

被折叠的 条评论
为什么被折叠?



