Simple Factory Pattern(简单工厂模式)
演示simple Factory Pattern
C#实例1---付款系统
简单工厂定义了创建对象的接口,创建对象是子类的实例化.在电子付款系统(Electronic Funds Transfer[EFT])中,会存在很多种电子交易方式,包括虚拟支票、信用卡、有线传送等。如果不应用简单工厂设计模式,代码捆绑在一起,有变动改起来就麻烦了
应用简单工厂设计模式,通过简单工厂类定义EFT的抽象类,该类定义处理方法,具体子类通过继承抽象类的方法来实现处理过程,这样,增加其他EFT就变得容易了,代码页更清晰了。类图如下:
代码如下:
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.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的高内聚责任分配原则,因此一般只在很简单的情况下使用。