Ví dụ về Factory Pattern trong C++
Bài viết này sẽ trình bày về Factory Pattern trong C++, một mẫu thiết kế phổ biến giúp tạo ra các đối tượng mà không cần chỉ định rõ lớp cụ thể của đối tượng đó. Điều này giúp tăng tính linh hoạt và khả năng mở rộng cho mã nguồn.
Factory Pattern là một mẫu thiết kế giúp tách biệt quá trình tạo đối tượng khỏi việc sử dụng đối tượng đó. Trong bài viết này, chúng ta sẽ cùng tìm hiểu cách sử dụng Factory Pattern để tạo ra các đối tượng khác nhau thông qua một lớp factory.
Mã C++
#include <iostream>
#include <memory>
#include <string>
// Interface cho sản phẩm
class Shape {
public:
virtual void draw() = 0; // Phương thức thuần ảo
virtual ~Shape() {}
};
// Lớp sản phẩm cụ thể: Circle
class Circle : public Shape {
public:
void draw() override {
std::cout << "Vẽ hình tròn." << std::endl;
}
};
// Lớp sản phẩm cụ thể: Square
class Square : public Shape {
public:
void draw() override {
std::cout << "Vẽ hình vuông." << std::endl;
}
};
// Lớp Factory
class ShapeFactory {
public:
// Phương thức tạo hình
std::unique_ptr<Shape> createShape(const std::string& shapeType) {
if (shapeType == "Circle") {
return std::make_unique<Circle>();
} else if (shapeType == "Square") {
return std::make_unique<Square>();
}
return nullptr; // Nếu không tìm thấy loại hình
}
};
int main() {
ShapeFactory shapeFactory;
// Tạo hình tròn
auto shape1 = shapeFactory.createShape("Circle");
shape1->draw();
// Tạo hình vuông
auto shape2 = shapeFactory.createShape("Square");
shape2->draw();
return 0;
}
Giải thích chi tiết từng dòng code
- Interface
Shape
: Định nghĩa phương thứcdraw()
mà các hình dạng sẽ triển khai. - Lớp
Circle
vàSquare
: Kế thừa từShape
, cung cấp triển khai cho phương thứcdraw()
. - Lớp
ShapeFactory
: Chứa phương thứccreateShape()
, nhận vào loại hình dạng và trả về đối tượng tương ứng. - Trong hàm
main()
: Sử dụngShapeFactory
để tạo ra các hình dạng cụ thể và gọi phương thứcdraw()
của chúng.
Yêu cầu hệ thống:
- Trình biên dịch C++ hỗ trợ C++11 trở lên.
Cách cài đặt các thư viện để chạy được đoạn mã C++ trên:
Chương trình này không yêu cầu cài đặt thư viện bên ngoài. Bạn chỉ cần một trình biên dịch C++ như g++.
Lời khuyên:
- Factory Pattern rất hữu ích trong các ứng dụng lớn nơi việc tạo đối tượng phức tạp có thể làm cho mã trở nên khó bảo trì. Hãy sử dụng mẫu thiết kế này khi bạn cần tạo nhiều loại đối tượng khác nhau mà không muốn bị ràng buộc vào lớp cụ thể.