將乙個複雜的物件的構建和其部件分離,將耦合度降到最低。換句話說,就是當初始化乙個物件需要很多步驟、複雜工作時,不要使用new來建立物件,而是通過工廠模式抽象出來專門生成物件的一種方法。**量會增加,但耦合度降低、維護方便。
工廠模式設計思路:工廠類負責對產品類的建立,即產品類不能直接例項,不能new,產品類的物件必須由工廠類建立。基於這個原則,產品類可抽象出來,可實現幾個子類,針對不同情況,工廠類分別可以建立不同的產品例項(多種產品子類),這些子類,外部同樣不能直接new出來,必須由工廠類建立。
2.1、產品類的**結構
class product
;class concreteproduct :public product
;private:
concreteproduct();
};
product為抽象產品,具有某些共同屬性的方法,具體實現過程,讓子類實現。由於產品類不可直接new建立,所以需要將建構函式私有化,外部不可訪問。(那麼工廠類如何可以訪問呢?稍後講解)
2.2、工廠類的**結構
class product;
class concreteproduct;
class factory
};
factory為工廠類,用於建立具體產品類物件,如 product*product=new concreteproduct;但是,此時的工廠類是無法訪問到子產品類的建構函式的(已經保護起來了),那麼此時需要乙個友元操作,讓子產品類的所有私有的屬性、方法,都能夠讓工廠類訪問,此時就需要在子產品類新增友元:friend class factory;
即最後子產品類,長這樣的
class concreteproduct :public product
; friend class factory;
private:
concreteproduct();
};
工廠模式的**結構就完成了
在編寫工廠方法有幾個需要注意的地方:
1、抽象產品和子產品類都需要私有化建構函式,否則外部能new出來,工廠模式就失效
2、子產品類需要新增工廠的友元宣告,否則工廠類無法訪問建構函式,就無法建立物件
3、工廠類需要乙個建立產品類的方法,創造子產品類(因為抽象產品為抽象類,此時通過子類物件傳遞指標,當具體使用這個指標時,實質是子類的指標,執行子類的函式)
4、這點最容易忽略:抽象產品類的析構函式必須為純虛函式,子類釋放時,根據這個純虛函式指標釋放記憶體,否則會造成記憶體洩漏,具體關於純虛函式指標方面以後在討論。
現在可以使用工廠來建立產品子類了
factory factory;
product* p=factory.createproduct();// 注意此時返回的是子類的指標
p->somefunction();// 呼叫的是子產品類的somefunction成員函式,這個過程就是動態繫結的過程,也是c++的繼承與多型特性
在使用過程中可以發現,子產品類並不能new建立,只能通過工廠類建立,這就是工廠模式的核心。
在實際運用過程中會經常遇到這樣的方式,此處簡單用乙個例子演示:
乙個汽車公司可以生產三款汽車,如奧迪、寶馬、日產,這些汽車各自有自身的功能如不同的速度,還有其他各方面的細節,省略。簡單的把這個工廠模式實現一下。
1、產品類的編寫
class icar
;class aodi :public icar
;private:
aodi();
friend class ca***ctory;
};class baoma :public icar
;private:
baoma();
friend class ca***ctory;
};class richan :public icar
;private:
richan();
friend class ca***ctory;
};
2、工廠類的編寫
class ca***ctory
; icar* createcar(carstyle style)
return car;
}private:
};
使用編寫好的工廠模式:
ca***ctory fac;
icar* baoma = fac.createcar(ca***ctory::baoma);// 建立一台寶馬
icar* aodi = fac.createcar(ca***ctory::aodi);// 建立一台奧迪
icar* richan = fac.createcar(ca***ctory::richan);// 建立一台日產
baoma->speed();
aodi->speed();
richan->speed();
1、優點:使用者根據自己需求建立不同的子類,模組化清晰,各司其職,分工明確
2、缺點:每增加乙個產品,相應的也要增加乙個子工廠,加大了額外的開發量。
工廠模式 (C )
1 uml設計圖 2 核心實現 public static insurancefactorygetinsurancefactory string type else if type.equals 汽車損壞 else if type.equals 財產安全 else if type.equals 人員...
C 工廠模式
本文參考1 本文參考2 軟體領域中的設計模式為開發人員提供了一種使用專家設計經驗的有效途徑。設計模式中運用了物件導向程式設計語言的重要特性 封裝 繼承 多型,真正領悟設計模式的精髓是可能乙個漫長的過程,需要大量實踐經驗的積累。最近看設計模式的書,對於每個模式,用c 寫了個小例子,加深一下理解。主要參...
c 工廠模式
簡單寫了乙個工廠模式 在這種模式下,有新增的類時,fileaccessfasctory.h 和filework,cpp這兩個檔案是穩定的,不需要修改,只需要修改fileaccess.h和fileaccess.cpp,或者新增檔案,這樣就在業務邏輯中隔離變化 同時也可以實現增量編譯,也不會影響業務 的...