定义场景:保存日志功能,分为:文本形式和数据库形式;
定义日志基类:
///
/// 日志
///
public class LogEntity
{
///
/// 保存
///
public virtual void DoSave() { }
///
/// 显示
///
public virtual void DoShow() { }}
扩展基类:
///
/// 文本方式日志
///
public class TxtLogEntity : LogEntity
{
public override void DoSave()
{
Console.WriteLine("save to txt");
}
public override void DoShow()
{
Console.WriteLine("show log as txt");
}
}
///
/// 数据库方式日志
///
public class DBLogEntity : LogEntity
{
public override void DoSave()
{
Console.WriteLine("save to db");
}
public override void DoShow()
{
Console.WriteLine("show log as db");
}}
定义日志创建接口:
///
/// 日志创建接口
///
public interface ILogCreator
{
LogEntity CreateLogFactory();}
实现接口:
public class TxtLogCreator : ILogCreator
{
public LogEntity CreateLogFactory()
{
return new TxtLogEntity();
}
}
public class DBLogCreator : ILogCreator
{
public LogEntity CreateLogFactory()
{
return new DBLogEntity();
}}
利用委托实现工厂:
///
/// 工厂创建委托
///
///
///
public delegate LogEntity LogEntityCreateFunc(string type);
public static class LogEntityCreateFactory
{
///
/// 创建日志实体
///
///
///
///
public static LogEntity CreateEntity(string aType, LogEntityCreateFunc createFunc)
{
return createFunc(aType);
}}
客户端调用:
static void Main(string[] args)
{
LogEntity log = LogEntityCreateFactory.CreateEntity("txt", MyCreateFunc);
log.DoSave();
log.DoShow();
Console.ReadKey();
}
///
/// 自定义工厂创建方式
///
///
///
static LogEntity MyCreateFunc(string aType)
{
if (aType == "txt")
{
return (new TxtLogCreator()).CreateLogFactory();
}
else if (aType == "db")
{
return (new DBLogCreator()).CreateLogFactory();
}
else
{
return null;
}}
优点:
1.充分体现了依赖倒置原则, 日志创建接口的设计,保证了最大的可扩展度,即如果日后需要实现一个基于第三方的日志功能,只需要实现接口即可,不需要修改原代码;
2.利用委托的特性,可以自定义创建规则,采用十分灵活的注入方式,最大化的解除了业务逻辑和代码的耦合。