抽象工厂模式

来源:互联网 发布:淘宝购物付款流程 编辑:程序博客网 时间:2024/05/23 20:09
       抽象工厂模式,提供一个创建一系列相关或者相互依赖对象的接口,而无需指定他们具体的类。

       抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象。根据LSP原则,任何接受父类型的地方,都应当能够接受子类型。因此,实际上系统所需要的,仅仅是类型与这些抽象产品角色相同的一些实例,而不是这些抽象产品的实例。换言之,也就是需要是这些抽象产品的具体子类的实例。工厂类负责创建抽象产品的具体子类的实例。
      与工厂方法模式相比,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式针对的是多个产品等级结构。
     抽象工厂模式主要用于具有多个产品等级的结构时。
     当有多个不同的等级结构的产品时,如果使用工厂方法模式就势必要使用多个独立的工厂等级结构来对付这些产品的等级结构。如果这些产品等级结构是平行的,会导致多个平行的工厂等级结构。这样会导致类多而造成重复。抽象工厂模式使用同一个工厂等级结构负责这些不同产品等级结构产品对象的创建。
      因此每个工厂角色都需要提供两个或以上的工厂方法,分别用于创建两个等级结构的产品。
抽象工厂模式与工厂方法模式的区别:
  1. 工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
  2. 抽象工厂不能直接创建产品,只能创建工厂,既抽象工厂创建的产品是工厂。虽然他也定义了创建产品的方法,但需要创建出来的具体工厂实现,既抽象工厂创建出的工厂创建产品。
应用场景:
      支持多种数据库的数据库接口访问层。
实例结构图:

代码:
//AbstractFactory.h
#include "stdafx.h"#include <iostream>using namespace std; //user产品族class CUser{public:virtual ~CUser(){}virtual void Operator() = 0;};class CSqlServerUser :public CUser{public:virtual void Operator(){cout << "SqlServer的User操作!" << endl;}};class CAccessUser :public CUser{public:virtual void Operator(){cout << "Access的User操作!" << endl;}};//Department产品族class CDepartment{public:virtual ~CDepartment(){}virtual void Operator() = 0;};class CSqlServerDepartment :public CDepartment{public:virtual void Operator(){cout << "SqlServer的Department操作!" << endl;}};class CAccessDepartment :public CDepartment{public :virtual void Operator(){cout << "Access的Department操作!" << endl;}};//抽象工厂,可以使用智能指针管理new的资源,此处为了侧重模式方法,不用class CFactory{public:virtual ~CFactory(){}virtual CUser* CreateUser() = 0;virtual CDepartment* CreateDepartment() = 0;};//具体产品工厂class CSqlServerFactory :public CFactory{public:virtual CUser* CreateUser(){return new CSqlServerUser();}virtual CDepartment* CreateDepartment(){return new CSqlServerDepartment();}};class CAccessFactory :public CFactory{public:virtual CUser* CreateUser(){return new CAccessUser();}virtual CDepartment* CreateDepartment(){return new CAccessDepartment();}};
//AbstractFactoryPattern.cpp
// AbstractFactoryPattern.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include "AbstractFactory.h"int _tmain(int argc, _TCHAR* argv[]){CFactory *Factory = new CSqlServerFactory();//此时与具体的类型解除了依赖CUser *pUser = Factory->CreateUser();pUser->Operator();delete(pUser);CDepartment *pDep = Factory->CreateDepartment();pDep->Operator();delete(pDep);//Factory = new CAccessFactory();pUser = Factory->CreateUser();pUser->Operator();delete(pUser);pDep = Factory->CreateDepartment();pDep->Operator();delete(pDep);getchar();return 0;}



0 0
原创粉丝点击