Design Pattern - Factory mode
《C++編程思想》筆記
1. 通用工廠,或者靜態工廠
在子類中把父類聲明爲友元類
在下面示例的工廠模式中,子類的構造函數的訪問權限爲private。而工廠方法
```C++
static Shape* factory(const string& type);
是父類的static方法。**工廠模式下子類對象只能在這個方法中進行創建**,所以需要在子類中把父類聲明爲友元類,或者把Shape::factory()聲明爲友元函數。
這樣,基類就必須瞭解每個派生類丁細節。**這是面向對象設計應該試圖避免的情況。**
```C++
//: C10:ShapeFactory1.cpp
class Shape {
public:
virtual void draw() = 0;
virtual void erase() = 0;
virtual ~Shape() {}
class BadShapeCreation : public logic_error {
public:
BadShapeCreation(string type)
: logic_error("Cannot create type " + type) {}
};
static Shape* factory(const string& type)
throw(BadShapeCreation);
};
class Circle : public Shape {
Circle() {} // Private constructor
friend class Shape; // *把父類設置爲友元類*
public:
void draw() { cout << "Circle::draw" << endl; }
void erase() { cout << "Circle::erase" << endl; }
~Circle() { cout << "Circle::~Circle" << endl; }
};
Shape* Shape::factory(const string& type)
throw(Shape::BadShapeCreation) {
if(type == "Circle") return new Circle;
if(type == "Square") return new Square;
throw BadShapeCreation(type);
}
2. 多態工廠
略
3. 抽象工廠
略
4. 虛構造函數
構造函數不能爲虛函數,因爲構造一個類型的對象時,必須知道有關對象類型的所有信息。
“虛構造函數”在這裏指的是接近虛構造函數的行爲。