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

工厂方法

以图书馆管理系统为例,需要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 {
            ...
        }        
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值