工厂方法
以图书馆管理系统为例,需要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 {
...
}
}