抽象工厂模式 别名:Kit
遵循原则:依赖倒置
意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类;
适用:
1、系统独立于它的产品的创建、组合、表示时
2、系统需要多个产品系列配置时
3、一系列相关产品进行联合使用时
4、提供产品类库,而只想显示它们的接口而不是实现时
参与者:
AbstractFactory
Concretefactory
AbstractProduct
ConcreteProduct
Client
效果:
1、分离了具体的类
2、易于交换产品系列
3、有利于产品的一致性
缺点:
难于支持新种类产品
参与者:
AbstractFactory、ConcreteFactory、AbstractProduct、ConcreteProduct、Client
实现:
1、工厂通常采用单件类实现;
2、创建产品通常为每一产品定义一工厂方法。有可能出现不同系列的产品差别很小,但却要定义一个具体工厂;多个产品系列中的具体工厂可以通过原型实现,具体工厂使用产品系列中的每个产品的原型实例来初始化,这样可使得不必每个新产品系列都需要一个新的具体工厂;
3、定义可扩展的工厂:采用标识性参数利用一个方法创建一组产品,虽灵活但不安全,在类C++语言中需要这些产品具体相同的基类或客户端可以安全地进行类型转换时,但支持类类型的语言中没有此约束;
相关:工厂方法[一般用来实现抽象工厂]、原型[抽象工厂的实现过程中的一种技巧]、单件[一般为单件类]
延伸:
Microsoft:IDbConnection类采用抽象工厂模式创建IDbCommand,但IDbCommand未采用抽象工厂模式创建IDbAdapter
示例:
C#
下面这个类扩展了DataCommand
namespace Sysnet.Data
{
    public static class DataAdapterHelper
    {
        public static DataAdapterBuilder Builder { get; set; }
        static DataAdapterHelper()
        {
            Builder = new DataAdapterBuilder();
        }
        public static IDataAdapter CreateDataAdapter(this IDbCommand command)
        {
            return Builder.CreateDataAdapter(command);//采用一个Builder主要是方便,将DataAdapter的创建功能的实现与接口进行分离,其思想是桥接模式
        }
        public static DataSet FillDataSet(this IDataAdapter adapter)
        {
            DataSet ds = new DataSet();
            adapter.Fill(ds);
            return ds;
        }
        
    }
}C++
class SQCOMMON_API CCommunicationInterface
{private:
DECLARE_PROPERTY(KeepOpen,bool)
public:
//通讯方式的枚举定义
enum CommunicationMethod 

//串口通讯方式
EnumCommuSerial,
//Socket通讯方式
EnumCommuSocket,
//数据库通讯方式
EnumCommuDatabase,
//文件通讯方式
EnumCommuFile 
};
protected:
//获取当前通讯接口下的一个通讯结点类型,此方法为工厂的产品方法
virtual CCommuEndPoint * get_ACommuEndPoint();
public:
//创建通讯接口
static CCommunicationInterface * CreateCommunication(CommunicationMethod commuMethod,map<CString,_variant_t> &paramters);
};