介绍
工厂模式是很常见的编程。如果检查.NET架构或任何其他框架工厂模式被广泛使用足见其受欢迎程度。工厂模式属于创建型模式,并将其与创建对象的交易。在这篇文章中,我们将尝试使用一个简单的C#控制台应用程序,了解工厂模式。
背景
当我们编写代码,我们使用遇到的情况,如创建基于某些条件是否或交换机的情况下的对象。如果该对象的创建不是基于经过验证的设计模式,那么我们实拍的对象创建复杂和未来的改进非常艰难。在这个时候,我们应该考虑工厂模式的对象创建逻辑抽象的复杂性,使未来的补充无忧无虑。
让我们的记录功能很简单的例子,在一个项目中,如果我们有如下的实施,然后添加一个新的记录选项需要在客户端的代码库这是不是一个好的做法相当的代码更改。
public void Log(string message, string type) { switch (type) { case "Database": DatabaseLogger databaseLogger = new DatabaseLogger(); databaseLogger.Log(message); break; case "EventViewer": default: EventViewerLogger eventviewerLogger = new EventViewerLogger(); eventviewerLogger.Log(message); break; } }
工厂模式无非是从客户端隐藏对象创建逻辑,这样最终客户不必担心对象造物逻辑,而客户可以参考使用通用接口的工厂模式创建的对象。
使用代码
为了更好地理解,我们可以创建一个简单的记录器工厂,这将有助于客户端消息记录到根据其选择不同的选项。
首先,我们需要创建一个接口或抽象类的基类,我们要在工厂创建实例的所有类。在这里,我用一个方法日志消息的接口ILogger。
interface ILogger
{
void Log(string Message);
}
现在,我们要在此我们想从记录器厂返回所有的类来实现这个ILogger。在这里,理想的Log方法应该有消息记录到文件中的实际方法,但用于展示的目的,我只是增加一个控制台消息。
class FileLogger : ILogger
{
public void Log(string Message)
{
Console.WriteLine("{0} - Logged in File.", Message);
}
}
以同样的方式实施ILogger到DatabaseLogger,还登录方法定义添加。
class DatabaseLogger : ILogger
{
public void Log(string Message)
{
Console.WriteLine("{0} - Logged in Database.", Message);
}
}
EventViewerLogger还从ILogger实现和Log方法定义的基础上增加的类型。我们可以添加新的记录器类相同的,因为这些记录器类。
class EventViewerLogger : ILogger
{
public void Log(string Message)
{
Console.WriteLine("{0} - Logged in EventViewer.", Message);
}
}
创建一个枚举轻松识别LoggerType,在情况下,如果我们有一个新的LoggerType那么我们可以在这里添加。
enum LoggerType
{
File,
Database,
EventViewer
}
最后,我们已经达到到的LoggerFactory,现在这个工厂将负责基于枚举值对象创建的,并且将返回创建的实例返回到客户端代码,这将是一个类型ILogger的。
class LoggerFactory
{
public static ILogger Get(LoggerType type)
{
switch (type)
{
case LoggerType.Database:
return new DatabaseLogger();
case LoggerType.EventViewer:
return new EventViewerLogger();
case LoggerType.File:
default:
return new FileLogger();
}
}
}
如果你看一下上面的代码,你可以看到,对象创建逻辑在工厂抽象和对象创建基于请求类型的对象,返回类型是一个接口ILogger,客户端代码不用担心新增加工厂。
已经写了一个客户端代码,以充分利用这家工厂,如下,
static void Main(string[] args)
{
ILogger logger1 = LoggerFactory.Get(LoggerType.Database);
logger1.Log("Message from Main");
ILogger logger2 = LoggerFactory.Get(LoggerType.File);
logger2.Log("Message from Main");
ILogger logger3 = LoggerFactory.Get(LoggerType.EventViewer);
logger3.Log("Message from Main");
Console.ReadKey();
/*Output
Message from Main - Logged in Database.
Message from Main - Logged in File.
Message from Main - Logged in EventViewer.
*/
}
在上面的代码在客户代码使用枚举来请求特定对象,并使用该对象的日志方法被调用。对象使用ILogger创建并使用工厂实例化。给下面的输出,
要自己探索这个样本可以下载附件中的代码或创建一个名为“FactoryPatternSample”一个控制台项目和替换Program.cs中的下面代码块的内容。
Program.cs中

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FactoryPatternSample
{
class Program
{
interface ILogger
{
void Log(string Message);
}
enum LoggerType
{
File,
Database,
EventViewer
}
class FileLogger : ILogger
{
public void Log(string Message)
{
Console.WriteLine("{0} - Logged in File.", Message);
}
}
class DatabaseLogger : ILogger
{
public void Log(string Message)
{
Console.WriteLine("{0} - Logged in Database.", Message);
}
}
class EventViewerLogger : ILogger
{
public void Log(string Message)
{
Console.WriteLine("{0} - Logged in EventViewer.", Message);
}
}
class LoggerFactory
{
public static ILogger Get(LoggerType type)
{
switch (type)
{
case LoggerType.Database:
return new DatabaseLogger();
case LoggerType.EventViewer:
return new EventViewerLogger();
case LoggerType.File:
default:
return new FileLogger();
}
}
}
static void Main(string[] args)
{
ILogger logger1 = LoggerFactory.Get(LoggerType.Database);
logger1.Log("Message from Main");
ILogger logger2 = LoggerFactory.Get(LoggerType.File);
logger2.Log("Message from Main");
ILogger logger3 = LoggerFactory.Get(LoggerType.EventViewer);
logger3.Log("Message from Main");
Console.ReadKey();
/*Output
Message from Main - Logged in Database.
Message from Main - Logged in File.
Message from Main - Logged in EventViewer.
*/
}
}
}
概要
在这篇文章中我已经解释了工厂模式用一个简单的C#应用程序。我希望你喜欢这篇文章,并得到了一些价值除了你的知识。请不要忘记,以纪念您的投票,建议和意见,以改善这一点,并即将发表的文章的质量。