设计模式学习之简单工厂模式

      简单工厂模式,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 }

 

最后可以稍微总结一下:

      当出现多个类是派生自同一个基类的时候,我们就可以通过这种设计方式来获取这些类的实例,这样也便于程序的统一管理和维护。

      当出现新的派生类的时候,只需要在工厂类中添加其相对应的实例条件以及代码就行了。

 

这里顺便总结一下接口和抽象类。

接口中不能出现字段,同时只能出现方法签名,不能出现方法体。

抽象类中可以定义抽象方法,当然抽象方法只能定义在抽象类中,抽象类中可以存在其他的方法。

当一个类继承了接口时,就必须要实现接口中的方法,如果出现了类中暂时不能实现接口的方法的情况时,可以将这个类定义成抽象类,然后在抽象类中将该方法定义为抽象方法。当然还有其他的实现方式,这里就不多说了。



 

    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值