简单工厂模式,SimpleFactory,是专门定义一个类来决定要实例化哪一个类,而待实例化的类都必须有共同的基类或者继承自同一个接口。
先看下面得代码:
定义一个用户接口,该接口包含一个用户登录和打印用户信息的方法
1
using
System;
2
using
System.Collections.Generic;
3
using
System.Text;
4
5
namespace
DesignPatterns.SimpleFactory
6
{
7
public
interface
IUser
8
{
9
///
<summary>
10
///
用户登录方法
11
///
</summary>
12
///
<param name="userName"></param>
13
///
<param name="userPwd"></param>
14
///
<returns>
0表示登录成功,1表示用户名错误,2表示密码错误
</returns>
15
int
UserLogin(
string
userName,
string
userPwd);
16
17
///
<summary>
18
///
打印用户信息
19
///
</summary>
20
void
PrintUserInfo();
21
}
22
}
创建一个用户类,该类为一个抽象类,作为所有用户子类的基类.该类继承了IUser接口,但是只实现了用户登录方法,而将用户信息打印方法定义为抽象方法,这样就可以推迟到用户类的子类中去实现.
1
using
System;
2
using
System.Collections.Generic;
3
using
System.Text;
4
5
namespace
DesignPatterns.SimpleFactory
6
{
7
public
abstract
class
User : IUser
8
{
9
private
string
userName;
10
11
private
string
userPwd;
12
13
public
string
UserName
14
{
15
get
{
return
userName; }
16
set
{ userName
=
value; }
17
}
18
19
public
string
UserPwd
20
{
21
get
{
return
userPwd; }
22
set
{ userPwd
=
value; }
23
}
24
25
public
int
UserLogin(
string
userName,
string
userPwd)
26
{
27
if
(userName
==
UserName)
28
{
29
if
(userPwd
==
UserPwd)
30
{
31
return
0
;
32
}
33
else
34
{
35
return
2
;
36
}
37
}
38
else
39
{
40
return
1
;
41
}
42
}
43
44
public
abstract
void
PrintUserInfo();
45
}
46
}
创建两个用户类的子类,Teacher和Student,在这两个子类中实现用户信息打印方法.
Teacher:
1
using
System;
2
using
System.Collections.Generic;
3
using
System.Text;
4
5
namespace
DesignPatterns.SimpleFactory
6
{
7
public
class
Teacher :User
8
{
9
public
Teacher()
10
{
11
this
.UserName
=
"
teacher
"
;
12
this
.UserPwd
=
"
teacher
"
;
13
}
14
public
override
void
PrintUserInfo()
15
{
16
Console.Write(
"
input your name:/n
"
);
17
string
userName;
18
userName
=
Console.ReadLine();
19
Console.Write(
"
/ninput your password:/n
"
);
20
string
userPwd;
21
userPwd
=
Console.ReadLine();
22
Console.Write(
"
/n
"
);
23
switch
(UserLogin(userName, userPwd))
24
{
25
case
0
:
26
Console.WriteLine(
"
I'm a Teacher
"
);
27
break
;
28
case
1
:
29
Console.WriteLine(
"
you name isn't exists
"
);
30
break
;
31
case
2
:
32
Console.WriteLine(
"
you password is wrong
"
);
33
break
;
34
}
35
}
36
}
37
}
Student:
1
using
System;
2
using
System.Collections.Generic;
3
using
System.Text;
4
5
namespace
DesignPatterns.SimpleFactory
6
{
7
public
class
Student:User
8
{
9
public
Student()
10
{
11
this
.UserName
=
"
student
"
;
12
this
.UserPwd
=
"
studen
"
;
13
}
14
15
public
override
void
PrintUserInfo()
16
{
17
Console.Write(
"
input your name:/n
"
);
18
string
userName;
19
userName
=
Console.ReadLine();
20
Console.Write(
"
/ninput your password:/n
"
);
21
string
userPwd;
22
userPwd
=
Console.ReadLine();
23
Console.Write(
"
/n
"
);
24
switch
(UserLogin(userName, userPwd))
25
{
26
case
0
:
27
Console.WriteLine(
"
I'm a Student
"
);
28
break
;
29
case
1
:
30
Console.WriteLine(
"
you name isn't exists
"
);
31
break
;
32
case
2
:
33
Console.WriteLine(
"
you password is wrong
"
);
34
break
;
35
}
36
}
37
}
38
}
最后即是工厂类,通过传入的userType的值来决定要获取哪一个子类的实例:
1
using
System;
2
using
System.Collections.Generic;
3
using
System.Text;
4
5
namespace
DesignPatterns.SimpleFactory
6
{
7
public
class
UserFactory
8
{
9
public
static
IUser User(
string
userType)
10
{
11
switch
(userType)
12
{
13
case
"
Teacher
"
:
14
return
new
Teacher();
15
case
"
Student
"
:
16
return
new
Student();
17
default
:
18
return
null
;
19
}
20
}
21
}
22
}
最后可以稍微总结一下:
当出现多个类是派生自同一个基类的时候,我们就可以通过这种设计方式来获取这些类的实例,这样也便于程序的统一管理和维护。
当出现新的派生类的时候,只需要在工厂类中添加其相对应的实例条件以及代码就行了。
这里顺便总结一下接口和抽象类。
接口中不能出现字段,同时只能出现方法签名,不能出现方法体。
抽象类中可以定义抽象方法,当然抽象方法只能定义在抽象类中,抽象类中可以存在其他的方法。
当一个类继承了接口时,就必须要实现接口中的方法,如果出现了类中暂时不能实现接口的方法的情况时,可以将这个类定义成抽象类,然后在抽象类中将该方法定义为抽象方法。当然还有其他的实现方式,这里就不多说了。