设计模式—抽象工厂(十一)

xiaoxiao2021-02-28  99

        软件领域中的设计模式的重要性不言而喻。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态。虽然知道这些特性的定义但是并没有做到真正的理解,这样特性有什么作用?用于什么场合中等等问题,带着疑问开始学习设计模式,主要参考《大话设计模式》和《设计模式:可复用面向对象软件的基础》两本书。  

        工厂模式:定义一个创建对象接口,让子类决定实例化哪一个类,在下图中就是定义了一个创建了对象的接口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; }

转载请注明原文地址: https://www.6miu.com/read-64502.html

最新回复(0)