简单工厂模式虽然简单,但存在一个很严重的问题。当系统中需要引入新产品时,由于静态工厂方法通过所传入参数的不同来创建不同的产品,这必定要修改工厂类的源代码,将违背“开闭原则”,如何实现增加新产品而不影响已有代码?工厂方法模式应运而生,本文将介绍第二种工厂模式——工厂方法模式。
某软件公司欲开发一个系统运行日志记录器(Logger),该记录器可以通过多种途径保存系统的运行日志,如通过文件记录或数据库记录,用户可以通过修改配置文件灵活地更换日志记录方式。在设计各类日志记录器时,公司的开发人员发现需要对日志记录器进行一些初始化工作,初始化参数的设置过程较为复杂,而且某些参数的设置有严格的先后次序,否则可能会发生记录失败。如何封装记录器的初始化过程并保证多种记录器切换的灵活性是开发人员面临的一个难题。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//
//
// 工厂方法模式演示程序
// 日志记录器
//
//
namespace LoggerProject
{
/// <summary>
/// 日志记录器接口,抽象产品
/// </summary>
interface Logger
{
void writeLog();
}
/// <summary>
/// 数据库日志记录器, 具体产品
/// </summary>
class DatabaseLogger : Logger
{
public void writeLog()
{
Console.WriteLine("数据库日志记录");
}
}
/// <summary>
/// 文件日志记录器, 具体产品
/// </summary>
class FileLogger : Logger
{
public void writeLog()
{
Console.WriteLine("文件日志记录");
}
}
/// <summary>
/// 日志记录器工厂接口, 抽象工厂
/// </summary>
interface LoggerFactory
{
Logger createLogger();
}
/* abstract class LoggerFactory
{
public void writeLog()
{
Logger logger = this.createLogger();
logger.writeLog();
}
public abstract Logger createLogger();
}*/
/// <summary>
/// 数据库日志记录器工厂类, 具体工厂
/// </summary>
class DatabaseLoggerFactory : LoggerFactory
{
public Logger createLogger()
{
Logger logger = new DatabaseLogger();
return logger;
}
}
/// <summary>
/// 文件日志记录器工厂类, 具体工厂
/// </summary>
class FileLoggerFactory : LoggerFactory
{
public Logger createLogger()
{
Logger logger = new FileLogger();
return logger;
}
}
class Program
{
static void Main(string[] args)
{
LoggerFactory factory;
Logger logger;
factory = new FileLoggerFactory();
logger = factory.createLogger();
logger.writeLog();
}
}
}