软件领域中的设计模式的重要性不言而喻。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态。虽然知道这些特性的定义但是并没有做到真正的理解,这样特性有什么作用?用于什么场合中等等问题,带着疑问开始学习设计模式,主要参考《大话设计模式》和《设计模式:可复用面向对象软件的基础》两本书。
工厂模式:定义一个创建对象接口,让子类决定实例化哪一个类,在下图中就是定义了一个创建了对象的接口IFactory,让它的两个子类SqlserverFactory、AccessFactory去决定实例化SQLserverUser还是AccessUser。
抽象工厂:定义了一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。下图中可知定义了一个创建一系列相关或者相互依赖的接口IFactory,它的每个子类创建了一系列相关的或者相互依赖的对象,根据子类创建的对象去实例化某个类。
抽象工厂的结构图如下:
抽象工厂模式
例:
#include <string>
#include <iostream>
#include <vector>
using namespace std;
//用户抽象接口
class IUser
{
public:
virtual void GetUser() = 0;
virtual void InsertUser() = 0;
};
//部门抽象接口
class IDepartment
{
public:
virtual void GetDepartment() = 0;
virtual void InsertDepartment() = 0;
};
//ACCESS用户
class CAccessUser : public IUser
{
public:
virtual void GetUser()
{
cout << "Access GetUser" << endl;
}
virtual void InsertUser()
{
cout << "Access InsertUser" << endl;
}
};
//ACCESS部门
class CAccessDepartment : public IDepartment
{
public:
virtual void GetDepartment()
{
cout << "Access GetDepartment" << endl;
}
virtual void InsertDepartment()
{
cout << "Access InsertDepartment" << endl;
}
};
//SQL用户
class CSqlUser : public IUser
{
public:
virtual void GetUser()
{
cout << "Sql User" << endl;
}
virtual void InsertUser()
{
cout << "Sql User" << endl;
}
};
//SQL部门类
class CSqlDepartment : public IDepartment
{
public:
virtual void GetDepartment()
{
cout << "sql getDepartment" << endl;
}
virtual void InsertDepartment()
{
cout << "sql insertdepartment" << endl;
}
};
//抽象工厂
class IFactory
{
public:
virtual IUser* CreateUser() = 0;
virtual IDepartment* CreateDepartment() = 0;
};
//ACCESS工厂
class AccessFactory : public IFactory
{
public:
virtual IUser* CreateUser()
{
return new CAccessUser();
}
virtual IDepartment* CreateDepartment()
{
return new CAccessDepartment();
}
};
//SQL工厂
class SqlFactory : public IFactory
{
public:
virtual IUser* CreateUser()
{
return new CSqlUser();
}
virtual IDepartment* CreateDepartment()
{
return new CSqlDepartment();
}
};
//客户端:
int main()
{
IFactory* factory = new SqlFactory();
IUser* user = factory->CreateUser();
IDepartment* depart = factory->CreateDepartment();
user->GetUser();
depart->GetDepartment();
return 0;
}