In a logging framework, you might need to log messages to different targets such as a file, database, or console. A factory can be used to create the appropriate logger based on configuration settings.
public interface ILogger
{
void Log(string message);
}
public class FileLogger : ILogger
{
public void Log(string message)
{
Console.WriteLine($"Logging to file: {message}");
}
}
public class DatabaseLogger : ILogger
{
public void Log(string message)
{
Console.WriteLine($"Logging to database: {message}");
}
}
public class ConsoleLogger : ILogger
{
public void Log(string message)
{
Console.WriteLine($"Logging to console: {message}");
}
}
public class LoggerFactory
{
public ILogger CreateLogger(string loggerType)
{
switch (loggerType.ToUpper())
{
case "FILE":
return new FileLogger();
case "DATABASE":
return new DatabaseLogger();
case "CONSOLE":
return new ConsoleLogger();
default:
throw new ArgumentException("Invalid logger type");
}
}
}
Usage in client code:
class Program
{
static void Main(string[] args)
{
LoggerFactory factory = new LoggerFactory();
ILogger logger = factory.CreateLogger("FILE");
logger.Log("This is a file log message.");
logger = factory.CreateLogger("DATABASE");
logger.Log("This is a database log message.");
logger = factory.CreateLogger("CONSOLE");
logger.Log("This is a console log message.");
}
}
In both examples, the Factory Pattern helps to encapsulate the object creation logic, making it easier to manage and extend the system. By using the factory, you can create objects based on input parameters without worrying about the specific implementation details, promoting code flexibility and scalability.