您的位置:首页 > 其它

极速理解设计模式系列:10.抽象工厂模式(Abstract Factory Pattern)

2011-09-28 10:32 831 查看
五个角色:抽象产品角色(AbstractProduct)、具体产品角色(Product)、抽象工厂角色(AbstractFactory)、具体工厂角色(ConcreteFactory)、客户端(Client)

抽象产品角色(AbstractProduct):声明产品接口

具体产品角色(Product):实现产品的接口

抽象工厂角色(AbstractFactory):声明生成对应抽象产品的方法

具体工厂角色(ConcreteFactory):实现生成抽象产品方法,生成产品

客户端(Client):执行生产并运行产品

实现思路:客户端调用具体的工厂角色调用具体的产品角色。

[b]类图:[/b]



应用场景:我们需要在测试环境和正式环境使用不同的日志类写日志。

日志可以分为两大类,分别是写入数据库和写入txt文件的。

其中写入数据库的有通过Sql语句写入MS Sql Server和Linq写入MongoDB。

写入Txt有通过Log4Net方式和普通Stream流。

分析:我们构建两个Factory工厂分别是用与测试环境的日志记录工厂(MongDB和Stream流)和生产环境的日志记录工厂(Mssql和Log4Net)。另外有两个抽象产品角色是:写入数据库、写入Txt。具体产品角色是MongDB方式、Stream流、Mssql和Log4Net。

下面我们在控制台程序去演示一下如何使用Abstract Factory Patterns:

一、 抽象产品角色(AbstractProduct):

#region 抽象产品角色

//插入数据库的抽象产品角色
abstract class DataBaseProduct
{
public abstract void WriteToDatabaseLog();
}

//写入Txt文件的抽象产品角色
abstract class TxtProduct
{
public abstract void WriteLogToTxt();
}

#endregion


二、具体产品角色(Product):

#region 具体产品角色

//插入数据库的Sql Server方式产品角色
class LogToSqlProduct : DataBaseProduct
{
public override void WriteToDatabaseLog()
{
Console.WriteLine("通过Sql写入Sql Server数据库");
}
}

//插入数据库的Linq To MongoDb方式产品角色
class LogToMongoDBProduct : DataBaseProduct
{
public override void WriteToDatabaseLog()
{
Console.WriteLine("通过Linq写入MongoDB数据库");
}
}

//插入Txt文件的Log4Net方式产品角色
class LogToLog4NetProduct : TxtProduct
{
public override void WriteLogToTxt()
{
Console.WriteLine("通过Log4Net写入txt文件");
}
}

//插入Txt文件的Stream方式产品角色
class LogToStreamProduct : TxtProduct
{
public override void WriteLogToTxt()
{
Console.WriteLine("通过Stream写入txt文件");
}
}

#endregion


三、抽象工厂角色(AbstractFactory):

#region 抽象工厂角色
//日志工厂
abstract class LogFactory
{
public abstract DataBaseProduct GetDataBaseProduct();

public abstract TxtProduct GetTxtProduct();
}

#endregion


四、具体工厂角色(ConcreteFactory):

#region 具体工厂角色

//用户测试环境的Log记录工厂类
class TestLogFactory : LogFactory
{
public override DataBaseProduct GetDataBaseProduct()
{
return new LogToMongoDBProduct();
}
public override TxtProduct GetTxtProduct()
{
return new LogToStreamProduct();
}
}

//用户生产环境的Log记录工厂类
class ProductionLogFactory : LogFactory
{
public override DataBaseProduct GetDataBaseProduct()
{
return new LogToSqlProduct();
}
public override TxtProduct GetTxtProduct()
{
return new LogToLog4NetProduct();
}
}

#endregion


五、客户端(Client):

#region 客户端

class program
{
static void Main(string[] args)
{
Console.WriteLine("在测试环境使用日志类记录日志到数据库和txt文件");
LogFactory logfactory = new TestLogFactory();
DataBaseProduct dataProduct = logfactory.GetDataBaseProduct();
TxtProduct txtProduct = logfactory.GetTxtProduct();
dataProduct.WriteToDatabaseLog();
txtProduct.WriteLogToTxt();
Console.WriteLine("---------------------------------------------------------");
Console.WriteLine("在生产环境使用日志类记录日志到数据库和txt文件");
logfactory = new ProductionLogFactory();
dataProduct = logfactory.GetDataBaseProduct();
txtProduct = logfactory.GetTxtProduct();
dataProduct.WriteToDatabaseLog();
txtProduct.WriteLogToTxt();

Console.ReadLine();
}
}

#endregion


如需源码请点击 AbstractFactoryPattern.rar 下载。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐