前面我們介紹了簡單工廠模式,在創建對象前,我們需要先創建工廠,然后再通過工廠去創建產品。
如果將工廠的創建方法static化,那么無需創建工廠即可通過靜態方法直接調用的方式創建產品:
// 工廠類,定義了靜態工廠方法
class SimpleFactory {
public:static Product* createProduct(const string& type) {if (type == "A") {return new ConcreteProductA();} else if (type == "B") {return new ConcreteProductB();} else {return nullptr;}}
};
將工廠創建方法改成 static 的優缺點如下:
優點:
- 無需實例化工廠類:使用靜態工廠方法可以直接通過類名調用,無需創建工廠類的實例,簡化了代碼。
- 不依賴對象狀態:靜態工廠方法不依賴于對象的狀態,因此可以保持更好的純粹性和確定性。
- 提高代碼可讀性:靜態工廠方法可以直接通過類名調用,使得代碼更加清晰和直觀。
缺點:
- 不容易被子類繼承和修改:靜態方法在子類中不能被重寫,因此不太適合需要在子類中定制創建邏輯的場景。
- 難以進行單元測試:靜態方法難以進行單元測試,特別是在需要模擬對象行為的情況下。
- 違背開閉原則:靜態工廠方法難以支持新增產品類型的擴展,需要修改工廠類的代碼,違背了開閉原則。
總的來說,靜態工廠方法在某些情況下可以簡化代碼,提高可讀性,但也存在一些局限性,特別是在需要靈活擴展和可測試性方面表現不佳。在實際應用中,需要根據具體的場景和需求來選擇是否使用靜態工廠方法。
靜態工廠方法還可以直接集成到類中,簡稱self create。
class A {private:A() {} // 私有構造函數,確保不能通過外部代碼創建新實例public:static A* CreateInstance() {return new A(); // 創建新實例并返回指針}public:void DoSomething() {// 實現具體功能}
};