簡單工廠模式 (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;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/540952.html
標籤:其他
上一篇:淺談系統性能提升的經驗和方法
