Simple Factory Pattern(简单工厂模式)

演示simple Factory Pattern

     C#实例1---付款系统

 

     简单工厂定义了创建对象的接口,创建对象是子类的实例化.在电子付款系统(Electronic Funds Transfer[EFT])中,会存在很多种电子交易方式,包括虚拟支票、信用卡、有线传送等。如果不应用简单工厂设计模式,代码捆绑在一起,有变动改起来就麻烦了

应用简单工厂设计模式,通过简单工厂类定义EFT的抽象类,该类定义处理方法,具体子类通过继承抽象类的方法来实现处理过程,这样,增加其他EFT就变得容易了,代码页更清晰了。类图如下:

 

 

 

   代码如下: 

 

代码
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 
 6 namespace ConsoleDesignPatterns
 7 {
 8     abstract class EFT
 9     {
10         public abstract void process();
11     }
12     class VirtualCheck:EFT
13     {
14         public override void process()
15         {
16             Console .WriteLine("虚拟支票处理中");
17         }
18     }
19     class MasterCard:EFT
20     {
21         public override void process()
22         {
23             Console .WriteLine ("万事达卡处理中");
24         }
25     }
26     class EFTFactory
27     {
28         public EFT CreatoEFT(string type)
29         {
30             switch (type.ToLower())
31             {
32             case "virtualcheck":
33                     return new VirtualCheck();
34                 break;
35             case "mastercard":
36                 return new MasterCard();
37                 break;
38             default:
39                 return null;
40                         
41             }
42         }
43     }
44     class Program
45     {
46         static void Main(string[] args)
47         {
48             EFT eft;
49             EFTFactory factory = new EFTFactory();
50             eft = factory.CreatoEFT("virtualcheck");
51             eft.process();
52             eft = factory.CreatoEFT("mastercard");
53             eft.process();
54             Console.Read();
55         }
56     }
57 }
58 
59 
60 

C#实例2----学校登陆系统

 

     系统允许多个级别的用户登录系统,通过登录名及口令来区分不同的用户级别。学校负责人及教师派生自学校用户类SchoolUser,一个实例工厂SimpleFactory提供一个方法,用于根据登录名/口令来生成不同级别的类的实例。类图如下:

 

    
      

 

     代码如下:

  

代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleDesignPatterns
{
    
public class SchoolUser
    {
        
public string FName;
        
public string LName;
        
public string UserType;
        
public void show()
        {
            Console.WriteLine(
"First Name:  "+FName);
            Console.WriteLine(
"Last Name: "+LName);
            Console.WriteLine(
"User Type:  "+UserType);
        }
    }
    
public class SchoolPrincipal:SchoolUser
    {
        
public SchoolPrincipal()
        {
            
this.FName="David";
            
this.LName = "Smith";
            
this.UserType = "Principal";
        }
    }
    
public class SchoolTeacher:SchoolUser
    {
        
public SchoolTeacher()
        {
            
this.FName = "Patrecia";
            
this.LName = "Terry";
            
this.UserType = "Teacher";
        }
    }
    
public class SimpleFactory
    {
        
public SchoolUser GetSchoolUser(string user ,string password)
        {
            
if (user == "Principal" && password == "Principal")
                
return new SchoolPrincipal();
            
if (user == "Teacher" && password == "Teacher")
                
return new SchoolTeacher();
            
return null;
        }
    }
    
class Program
    {
        
static void Main(string[] args)
        {
            SimpleFactory sf 
= new SimpleFactory();
            SchoolUser su;
            su 
= sf.GetSchoolUser("Principal""Principal");
            Console.WriteLine(
"--------------------校长登陆------------------------");
            su.show();
            Console.WriteLine(
"--------------------教师登陆------------------------");
            su 
= sf.GetSchoolUser("Teacher""Teacher");
            su.show();
            Console.Read();
        }
    }
}

 

 优势和缺陷

      在简单工厂模式中,工厂类是整个模式的关键所在。它包含必要的判断逻辑,能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面中摆脱出来,仅仅需要负责“消费”对象就可以了,而不必管这些对象究竟是如何创建以及如何组织的。这样就明确区分了各自的职责和权力,有利于整个软件体系结构的优化。

      不过,凡事有利就有弊,简单工长模式的缺点也正体现在其工厂类上。由于工厂类集中了所有的创建逻辑,很容易违反GRASPR的高内聚的责任分配原则。将全部创建逻辑都集中到一个工厂类中还有一个缺点,那就是当系统中的具体产品类不断增多时,可能会出现要求工厂类根据不同条件创建不同实例的要求。这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的扩展和维护也非常不利。

 应用情景:

       下列情况适用于应用简单工厂模式:

     1、工厂类负责创建的对象比较少;

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

     由于简单工厂很容易违反GRASPR的高内聚责任分配原则,因此一般只在很简单的情况下使用。

posted @ 2009-12-03 17:29  墨白麒麟  阅读(563)  评论(1编辑  收藏  举报