Core Design Patterns(11) Abstract Factory 抽象工厂模式
VS 2008
针对多个平行产品体系的产品创建问题,使用抽象工厂模式
1. 模式UML图
![](/images/cnblogs_com/guozhijian/Design Pattern/absfactory-1.gif)
2. 应用
考虑应用程序支持多种数据库的设计,对于领域对象的数据库访问层定义数据访问的接口,分别提供基于SqlServer的实现和基于Oracle的实现。
![](/images/cnblogs_com/guozhijian/Design Pattern/absfactory-2.gif)
IUser.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
![](/Images/OutliningIndicators/None.gif)
namespace DesignPattern.AbstractFactory.DAL {
public interface IUser {
![](/Images/OutliningIndicators/InBlock.gif)
void Operation();
}
}
SqlUser.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
![](/Images/OutliningIndicators/None.gif)
namespace DesignPattern.AbstractFactory.DAL {
public class SqlUser : IUser {
IUser Members
}
}
OracleUser.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
![](/Images/OutliningIndicators/None.gif)
namespace DesignPattern.AbstractFactory.DAL {
public class OracleUser : IUser {
IUser Members
}
}
ITopic.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
![](/Images/OutliningIndicators/None.gif)
namespace DesignPattern.AbstractFactory.DAL {
public interface ITopic {
![](/Images/OutliningIndicators/InBlock.gif)
void Operation();
}
}
SqlTopic.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
![](/Images/OutliningIndicators/None.gif)
namespace DesignPattern.AbstractFactory.DAL {
public class SqlTopic : ITopic {
ITopic Members
}
}
OracleTopic.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
![](/Images/OutliningIndicators/None.gif)
namespace DesignPattern.AbstractFactory.DAL {
public class OracleTopic: ITopic {
ITopic Members
}
}
IDALFactory.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
![](/Images/OutliningIndicators/None.gif)
namespace DesignPattern.AbstractFactory.DAL {
public interface IDALFactory {
![](/Images/OutliningIndicators/InBlock.gif)
IUser CreateUser();
ITopic CreateTopic();
}
}
SqlFactory.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
![](/Images/OutliningIndicators/None.gif)
namespace DesignPattern.AbstractFactory.DAL {
public class SqlFactory : IDALFactory {
IDALFactory Members
}
}
OracleFactory.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
![](/Images/OutliningIndicators/None.gif)
namespace DesignPattern.AbstractFactory.DAL {
public class OracleFactory : IDALFactory {
IDALFactory Members
}
}
Client
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DesignPattern.AbstractFactory.DAL;
![](/Images/OutliningIndicators/None.gif)
namespace DesignPattern.AbstractFactory {
class Program {
static void Main(string[] args) {
![](/Images/OutliningIndicators/InBlock.gif)
IDALFactory sqlFactory = new SqlFactory();
IUser sqlUser = sqlFactory.CreateUser();
sqlUser.Operation();
![](/Images/OutliningIndicators/InBlock.gif)
ITopic sqlTopic = sqlFactory.CreateTopic();
sqlTopic.Operation();
![](/Images/OutliningIndicators/InBlock.gif)
IDALFactory oracleFactory = new OracleFactory();
IUser oracleUser = oracleFactory.CreateUser();
oracleUser.Operation();
![](/Images/OutliningIndicators/InBlock.gif)
ITopic oracleTopic = oracleFactory.CreateTopic();
oracleTopic.Operation();
}
}
}
Output
针对多个平行产品体系的产品创建问题,使用抽象工厂模式
1. 模式UML图
![](/images/cnblogs_com/guozhijian/Design Pattern/absfactory-1.gif)
2. 应用
考虑应用程序支持多种数据库的设计,对于领域对象的数据库访问层定义数据访问的接口,分别提供基于SqlServer的实现和基于Oracle的实现。
![](/images/cnblogs_com/guozhijian/Design Pattern/absfactory-2.gif)
IUser.cs
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
SqlUser.cs
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
OracleUser.cs
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
ITopic.cs
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
SqlTopic.cs
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
OracleTopic.cs
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
IDALFactory.cs
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
SqlFactory.cs
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
OracleFactory.cs
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
Client
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
Output
![](/images/cnblogs_com/guozhijian/Design Pattern/absfactory-3.gif)