Simple Factory Pattern(简单工厂模式)

演示simple Factory Pattern

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

 

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

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

 

 

 Simple Factory Pattern(简单工厂模式)

   代码如下: 

 

代码
 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提供一个方法,用于根据登录名/口令来生成不同级别的类的实例。类图如下:

 

    
      

Simple Factory Pattern(简单工厂模式) 

     代码如下:

  

代码
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的高内聚责任分配原则,因此一般只在很简单的情况下使用。

你可能感兴趣的:(Pattern)