簡單工廠模式 (C++) 工廠模式的使用場景也比較多,像是一些組件對象的創建場景,這裡說一下簡單工廠模式。 特點及應用 1. 特點 (1)封裝具體實現,只提供管理對象介面 舉個例子:我現在需要一個界面工廠,工廠只需要給我對應界面就可以,而我不需要去關心界面裡面是怎樣實現的,如何創建的。 (2)集中管 ...
簡單工廠模式 (C++)
工廠模式的使用場景也比較多,像是一些組件對象的創建場景,這裡說一下簡單工廠模式。
特點及應用
1. 特點
(1)封裝具體實現,只提供管理對象介面
舉個例子:我現在需要一個界面工廠,工廠只需要給我對應界面就可以,而我不需要去關心界面裡面是怎樣實現的,如何創建的。
(2)集中管理和控制
因為創建的產品不多,通常一個工廠類就行,這個工廠既可以負責同一類產品的創建,也可以是不同,實現對外創建對象的職責集中管理和控制。
(3)根據參數返回實例
你想返回得到一個什麼樣的對象實例,往往取決參數的選擇,這個需要結合實際情況去選擇。
2. 解決了什麼問題
(1)通過簡單工廠,實現調用類和具體實現類的解耦。(2) 幫助封裝,面向介面編程。(3)集中管理。
3. 選擇
(1)負責創建的對象比較少,業務邏輯不過於複雜。
寫法介紹
結構組成
- 一個抽象父類產品,若幹子類產品,一個工廠類(不是抽象類)。
具體實現
- 產品類
#ifndef PRODUCT_H
#define PRODUCT_H
#include <iostream>
enum ProductTypeItem
{
PRODUCT_ITEM_NONE,
PRODUCT_ITEM_APPLE,
PRODUCT_ITEM_BANANA,
PRODUCT_ITEM_NR
};
class productParent
{
public:
explicit productParent(ProductTypeItem type)
: mType(type)
{
std::cout << "I am [" << mType << "]!" << std::endl;
}
productParent(const productParent &) = delete;
productParent &operator=(const productParent &) = delete;
virtual ~productParent(){}
virtual ProductTypeItem getProductName(){}
protected:
ProductTypeItem mType;
};
class productApple : public productParent
{
public:
explicit productApple(ProductTypeItem type) : productParent(type){}
productApple(const productApple &) = delete;
productApple &operator=(const productApple &) = delete;
~productApple(){}
};
class productBanana : public productParent
{
public:
explicit productBanana(ProductTypeItem type) : productParent(type){}
productBanana(const productBanana &) = delete;
productBanana &operator=(const productBanana &) = delete;
~productBanana(){}
};
#endif // PRODUCT_H
- 工廠類
#ifndef FACTORYABSTRACT_H
#define FACTORYABSTRACT_H
#include "product.h"
class MyFactory
{
public:
MyFactory(){}
~MyFactory(){}
// 有的也會把創建方法寫成靜態,那麼這個方法就屬於類,不用創建對象也能使用
// static productParent *createProduct(ProductTypeItem type)
productParent *createProduct(ProductTypeItem type)
{
switch (type)
{
case PRODUCT_ITEM_APPLE:
return new productApple(type);
case PRODUCT_ITEM_BANANA:
return new productBanana(type);
default:
break;
}
return nullptr;
}
};
#endif // FACTORYABSTRACT_H
- main函數
#include "factory.h"
int main()
{
MyFactory factory;
productParent *apple = factory.createProduct(PRODUCT_ITEM_APPLE);
productParent *banana = factory.createProduct(PRODUCT_ITEM_BANANA);
delete apple;
delete banana;
return 0;
}