【设计模式】工厂模式与抽象工厂模式

工厂方法

以图书馆管理系统为例,需要API提供查询不同专业分类的书目列表,一般实现,

class LibraryManager {
public:
    LibraryManager() {}
    //按专业分类查询
    BookList Query(Type type) {
        if(type == TA) {
            return ...;
        } else if (type == TB) {
        } else if (...) {
        //...
        } else {
            return type_null;
        }        
    }
};

可以把构建返回对象,提取到工厂类,

class BookFactory {
public:
    Booklist CreateBooklist(Type type) {
        if(type == TA) {
            return ...;
        } else if (type == TB) {
        } else if (...) {
        //...
        } else {
            return type_null;
        } 
    }
};
class LibraryManager {
public:
    LibraryManager(BookFactory factory) {
        this.factory_ = factory;
    }
    BookList Query(Type type) {
        return this.factory.CreateBooklist(type);
    }
private:
    this.factory_;
};

现在增加一个需求,增加文学书籍类,专业类、文学类都要支持按语种检索,工厂模式便于对新增需求的扩展,

class BookFactory {
public: 
    virtual Booklist CreateBooklist(Type type) = 0;
}
class LanguageBookFactory: public BookFactory {
public: 
    Booklist CreateBooklist(Type type) {
    //
    }
};
class ProfessionalBookFactory: public BookFactory {
public: 
    Booklist CreateBooklist(Type type) {
    //
    }
};

抽象工厂方法

另一个场景,读者查、借还书都需要管理系统从数据库查询书籍、读者账户系统,同时考虑系统未来用不同的第三方数据库,如何设计呢?

class LibraryManager {
public:
    void QueryDB() {
        if(config_.db_type == MYSQL) {
            //具体实现
        } else if(config_.db_type == SQLLITE) {
            ...
        } else {
            ...
        }        
    }
private:
Config config_;
};

用统一的工厂接口提供获取数据的功能,

class DataFactory {
public:
    virtual ReaderInfo RetriveReaderInfo() = 0;
    virtual BookInfo RetriveBookInfo() = 0;
};
class DataFactoryMysql: public DataFactory {
//具体实现
}
class DataFactorySqllite: public DataFactory {
//具体实现
}
class LibraryManager {
public:
    void QueryDB() {
        if(config_.db_type == MYSQL) {
            auto mysql = std::make_shared<DataFactoryMysql>();
            mysql->RetriveReaderInfo();
        } else if(config_.db_type == SQLLITE) {
            ...
        } else {
            ...
        }        
    }

相关推荐

  1. 设计模式工厂模式抽象工厂模式

    2024-03-12 00:02:03       25 阅读
  2. 设计模式 抽象工厂

    2024-03-12 00:02:03       24 阅读
  3. 设计模式抽象工厂

    2024-03-12 00:02:03       26 阅读
  4. 设计模式-抽象工厂模式

    2024-03-12 00:02:03       27 阅读
  5. 设计模式-抽象工厂模式

    2024-03-12 00:02:03       18 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-12 00:02:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-12 00:02:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-12 00:02:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-12 00:02:03       18 阅读

热门阅读

  1. FPGA TestBench编写学习

    2024-03-12 00:02:03       21 阅读
  2. Ubuntu 22.04 server 安装GNOME/XFCE/KDE桌面环境

    2024-03-12 00:02:03       18 阅读
  3. JVM相关面试题及常用命令参数

    2024-03-12 00:02:03       20 阅读
  4. 力扣代码学习日记七

    2024-03-12 00:02:03       25 阅读
  5. Latex 超长矩阵如何处理显示问题

    2024-03-12 00:02:03       28 阅读