C#设计模式之1——简单工厂模式

来源:互联网 发布:星际淘宝网起点 编辑:程序博客网 时间:2024/04/30 09:26


在OO编程中最常用到的一个模式就是简单工厂(Simple Factory)模式。

简单工厂模式根据提供的数据或者参数返回几个可能的类中的一个实例,说通俗点有点像面向对象编程中的多态性,一个基类,有多个派生类,在另外的调用程序中,根据参数来决定返回这个基类的哪个具体的派生类,返回值为基类类型,因为基类的引用可以指向派生类对象,而且这些所有的派生类都包含有基类的函数,也就是说派生类中有相同的函数,但是函数的实现可能不同。

在简单工厂模式中,通常其返回的所有的类都有一个共同的基类和一些共同的方法,不过每一个类都完成不同的功能,并针对不同的数据类型做了不同的优化。简单工厂模式实际上并不是23个常用设计模式之一,但是也算是设计模式的简单入门,对以后的学习有比较大的帮助。

 

简单的理解,简单工厂模式更多的使用了面向对象编程中的多态性,基类的引用可以指向派生类,并且调用派生的方法,即多态性。

 

假定X是一个基类,XY和XZ都是派生于X的派生类,XFactory类中根据提供给它的参数来决定返回XY或者 类的哪一个,返回的是哪个类的实例对于编程者来说并不是那么重要,因为这些类有着相同的方法,编程者需要做的就是通过基类引用直接调用方法,不用去关心到底返回的是哪个派生类,因为这些类有相同的方法,只是实现不同而已。如何决定返回哪一个派生类,取决于工厂的设计,该方法可以是非常复杂的函数,也可以是简单的函数。

 

简单工厂模式的基本原理:

创建一个抽象工厂,它决定返回哪一个类的实例并将该实例返回。接下来可以调用那个类实例的方法,但不需要知道具体使用的是哪一个子类,这种方法把和数据相关的问题与类的其他方法分隔开来。它能返回具有同样方法的类的实例,它们可以是不同的派生子类的实例,也可以是实际上毫无关系仅仅是共享了相同接口的类。不管哪一种类实例中的方法必须是相同的,并且能够被交替使用。


以下内容就是从该书中摘抄下来的,实例都经过测试了,而且容易理解,特意积累下来。

 

Simple Factory Pattern(简单工厂模式):专门创建一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

 

C#实例1——电子付款系统

[c-sharp] view plaincopy
  1. using System;  
  2. namespace EFT  
  3. {  
  4.     //抽象电子付款类  
  5.     abstract class EFT  
  6.     {  
  7.         public abstract void process();  
  8.     }  
  9.     //具体子类,虚拟检查  
  10.     class VirtualCheck : EFT  
  11.     {  
  12.         public override void process()  
  13.         {  
  14.             Console.WriteLine("虚拟支票处理中");  
  15.         }  
  16.     }  
  17.   
  18.     //具体子类,万事达卡  
  19.     class MasterCard : EFT  
  20.     {  
  21.         public override void process()  
  22.         {  
  23.             Console.WriteLine("万事达卡处理中");  
  24.         }  
  25.     }  
  26.   
  27.     //简单工厂类,创建的实例都有共同的父类EFT  
  28.     class EFTFactory  
  29.     {  
  30.         public EFT createEFT(string type)  
  31.         {  
  32.             switch (type)  
  33.             {  
  34.                 case "virtualcheck":  
  35.                     return new VirtualCheck();  
  36.                 case "mastercard":  
  37.                     return new MasterCard();  
  38.                 default:  
  39.                     return null;  
  40.             }  
  41.         }  
  42.     }  
  43.     //客户应用测试  
  44.     class Client  
  45.     {  
  46.         [STAThread]  
  47.         static void Main(string[] args)  
  48.         {  
  49.             EFT eft;  
  50.             EFTFactory eftFactory = new EFTFactory();  
  51.             eft = eftFactory.createEFT("virtualcheck");  
  52.             eft.process();  
  53.             eft = eftFactory.createEFT("mastercard");  
  54.             eft.process();  
  55.             Console.Read();//读取按键才结束程序,方便查看结果  
  56.         }  
  57.     }  
  58. }  

输出:

  虚拟支票处理中

  万事达卡处理

C#实例2——学校登录系统

[c-sharp] view plaincopy
  1. using System;  
  2. namespace SchoolSystem  
  3. {  
  4.     //Base Class 基类  
  5.     public class SchoolUser  
  6.     {  
  7.         public string FName;  
  8.         public string LName;  
  9.         public string UserType;  
  10.         public void Show()  
  11.         {  
  12.             Console.Write("First Name:" + FName + "/n");  
  13.             Console.Write("Last Name:" + LName + "/n");  
  14.             Console.Write("User Type:" + UserType + "/n");  
  15.         }  
  16.     }  
  17.     //Derived Classes  
  18.     public class SchoolPrincipal : SchoolUser  
  19.     {  
  20.         public SchoolPrincipal()  
  21.         {  
  22.             FName = "David";  
  23.             LName = "Smith";  
  24.             UserType = "Principal";  
  25.         }  
  26.     }  
  27.   
  28.     public class SchoolTeacher : SchoolUser  
  29.     {  
  30.         public SchoolTeacher()  
  31.         {  
  32.             FName = "Patrecia";  
  33.             LName = "Terry";  
  34.             UserType = "Teacher";  
  35.         }  
  36.     }  
  37.     //简单工厂类  
  38.     public class SimpleFactory  
  39.     {  
  40.         public SchoolUser GetSchoolUser(string user, string password)  
  41.         {  
  42.             if (user == "Principal" && password == "Principal")  
  43.             {  
  44.                 return new SchoolPrincipal();  
  45.             }  
  46.             if (user == "Teacher" && password == "Teacher")  
  47.             {  
  48.                 return new SchoolTeacher();  
  49.             }  
  50.             return null;  
  51.         }  
  52.     }  
  53.   
  54.     class Client  
  55.     {  
  56.         static void Main(string[] args)  
  57.         {  
  58.             SimpleFactory sf = new SimpleFactory();  
  59.             SchoolUser su;  
  60.             su = sf.GetSchoolUser("Principal""Principal");  
  61.             Console.Write("---------------校长登录---------------/n");  
  62.             su.Show();  
  63.             Console.Write("---------------教师登录---------------/n");  
  64.             su = sf.GetSchoolUser("Teacher""Teacher");  
  65.             su.Show();  
  66.             Console.Read();  
  67.         }  
  68.     }  
  69. }  

输出:

---------------校长登录---------------

First Name:David

Last Name:Smith

User Type:Principal

---------------教师登录---------------

First Name:Patrecia

Last Name:Terry

User Type:Teacher


应用场景:

(1)       工厂类负责创建的对象比较少。

(2)       客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心。


0 0
原创粉丝点击