前文初始篇c++ 深入淺出工廠模式(初始篇),主要闡述了簡單工廠模式、工廠方法模式和抽象工廠模式的結構、特點和缺陷等。以上三種方式,在新增產品時,要麼修改工廠類,要麼需新增具體的工廠類,說明工廠類的封裝性還不夠好。
本文高階篇,主要是將工廠類的封裝性提高,達到新增產品時,也不需要修改工廠類,不需要新增具體的工廠類。封裝性高的工廠類特點是擴充套件性高、復用性也高。
針對工廠方法模式封裝成模板工廠類,那麼這樣在新增產品時,是不需要新增具體的工廠類,減少了**的編寫量。
uml圖:
模板工廠**:
// 基類 鞋子
class shoes
};// 耐克鞋子
class nikeshoes : public shoes
};// 基類 衣服
class clothe
};// 優衣庫衣服
class uniqloclothe : public clothe
};
// 抽象模板工廠類
// 模板引數:abstractproduct_t 產品抽象類
template class abstractfactory
};// 具體模板工廠類
// 模板引數:abstractproduct_t 產品抽象類,concreteproduct_t 產品具體類
template class concretefactory : public abstractfactory
};
int main()
[root@lincoding factory]# ./templatefactory
我是耐克球鞋,我的廣告語:just do it
我是優衣庫衣服,我的廣告語:i am uniqlo
前面的模板工廠雖然在新增產品的時候,不需要新增具體的工廠類,但是缺少乙個可以統一隨時隨地獲取指定的產品物件的類。
還有改進的空間,我們可以把產品註冊的物件用std::map
的方式儲存,通過key-valve
的方式可以輕鬆簡單的獲取對應的產品物件例項。
實現大致思路:
uml圖:
產品註冊模板類+單例工廠模板類:
// 基類,產品註冊模板介面類
// 模板引數 producttype_t 表示的類是產品抽象類
template class iproductregistrar
virtual ~iproductregistrar() {}
private:
// 禁止外部拷貝和賦值操作
iproductregistrar(const iproductregistrar &);
const iproductregistrar &operator=(const iproductregistrar &);
};// 工廠模板類,用於獲取和註冊產品物件
// 模板引數 producttype_t 表示的類是產品抽象類
template class productfactory
// 產品註冊
void registerproduct(iproductregistrar*registrar, std::string name)
// 根據名字name,獲取對應具體的產品物件
producttype_t *getproduct(std::string name)
// 未註冊的產品,則報錯未找到
std::cout << "no product found for " << name << std::endl;
return null;
}private:
// 禁止外部構造和虛構
productfactory() {}
~productfactory() {}
// 禁止外部拷貝和賦值操作
productfactory(const productfactory &);
const productfactory &operator=(const productfactory &);
// 儲存註冊過的產品,key:產品名字 , value:產品型別
std::map*> m_productregistry;
};// 產品註冊模板類,用於建立具體產品和從工廠裡註冊產品
// 模板引數 producttype_t 表示的類是產品抽象類(基類),productimpl_t 表示的類是具體產品(產品種類的子類)
template class productregistrar : public iproductregistrar
// 建立具體產品物件指標
producttype_t *createproduct()
};
int main()
// *************************= 生產優衣庫衣服過程 *************************==//
// 註冊產品種類為clothe(基類),產品為uniqloclothe(子類)到工廠,產品名為uniqlo
productregistraradidasshoes("uniqlo");
// 從工廠獲取產品種類為shoes,名稱為adidas的產品物件
clothe *puniqloclothe = productfactory::instance().getproduct("uniqlo");
// 顯示產品的廣告語
puniqloclothe->show();
// 釋放資源
if (puniqloclothe)
return 0;
}
[root@lincoding factory]# ./singlefactory
我是耐克球鞋,我的廣告語:just do it
我是優衣庫衣服,我的廣告語:i am uniqlo
將工廠方法模式改良成模板工廠,雖然可以解決產品新增時,不需要新增具體工廠類,但是缺少乙個可以隨時隨地獲取產品物件的方式,說明還有改進的空間。
將模板工廠改良成產品註冊模板類+單例工廠模板類,產品註冊模板類用於註冊不同型別的產品,單例工廠模板類用於獲取指定已註冊的產品物件。這種方式,可以把工廠模式中產品的註冊和獲取的主要功能很好的抽象成兩個類,並且使用單例模式使得工廠類可以隨時隨地獲取已註冊的產品物件。
所以產品註冊模板類+單例工廠模板類的工廠模式,達到了開閉法則,並且擴充套件性高和封裝度高。
ps:想學習更多單例模式,可以參考c++ 執行緒安全的單例模式總結文章閱讀。
C 深入淺出工廠模式(高階篇)
前文初始篇c 深入淺出工廠模式 初始篇 主要闡述了簡單工廠模式 工廠方法模式和抽象工廠模式的結構 特點和缺陷等。以上三種方式,在新增產品時,要麼修改工廠類,要麼需新增具體的工廠類,說明工廠類的封裝性還不夠好。本文高階篇,主要是將工廠類的封裝性提高,達到新增產品時,也不需要修改工廠類,不需要新增具體的...
深入淺出工廠設計模式
本文出自方志朋的部落格 工廠設計模式 一.什麼是工廠設計模式 工廠模式是我們最常用的例項化物件模式了,是用工廠方法代替new操作的一種模式。因為工廠模式就相當於建立例項物件的new,雖然這樣做,可能多做一些工作,但會給你系統帶來更大的可擴充套件性和盡量少的修改量。工廠模式最直接的作用就是將建立物件和...
深入淺出之工廠模式
首先說說簡單工廠模式,我用現實中的汽車工廠舉例子,首先有個汽車類的介面叫做car,裡面有個開車的方法叫做drive 然後有個吉利車的類叫做jili,實現了car的介面,還有個奇瑞車的類叫做qirui,也實現了car的介面 因為都是車嘛,當然能開了 inte ce carelse if qirui e...