您的位置:首页 > 其它

Simple Factory Pattern(简单工厂模式)

2009-12-03 17:29 423 查看
演示simple Factory Pattern

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

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

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

代码

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的高内聚责任分配原则,因此一般只在很简单的情况下使用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: