1. 程式人生 > >簡單工廠模式、工廠模式、抽象工廠模式比較

簡單工廠模式、工廠模式、抽象工廠模式比較

![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL3N6X21tYml6X3BuZy91Y2RZbUdYTGlhOWljVThpYkVyTzFNVlEwT3pocmliaFh3VGxyM2dxU29pYWVDa1VqeW5Ca21vWFFncUdtVjVWSVUzNFZEWWN2ZGpTZ3lmcU8wbEtIeUpTQ3R3LzY0MA?x-oss-process=image/format,png,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2x5bjYzMTU3OTc0MQ==,size_16,color_FFFFFF,t_70) # 前言: 設計模式已經經歷了很長一段時間的發展,它們提供了軟體開發過程中面臨的一般問題的最佳解決方案。學習這些模式有助於經驗不足的開發人員通過一種簡單快捷的方式來學習軟體設計。 一般我們會說設計模式一共有23種,總體來說設計模式分為三大類: 建立型模式,共五種:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式。 結構型模式,共七種:介面卡模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式。 行為型模式,共十一種:策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、直譯器模式。 今天主要是分析 簡單工廠模式、工廠模式和抽象工廠模式的區別,所以這裡就簡單介紹一下設計模式的概念。 **作者:良知猶存** 轉載授權以及圍觀:歡迎新增微信公眾號:**羽林君** *** **網上**的很多資料都是在闡述著:工廠模式的好處就是解耦。相信大家對解耦這個詞也不陌生,那解耦究竟有什麼好處呢? * 1.為了提高內聚(Cohesion)和鬆耦合(Coupling),我們經常會抽象出一些類的公共介面以形成抽象基類或者介面。這樣我們可以通過宣告一個指向基類的指標來指向實際的子類實現,達到了多型的目的。這裡很容易出現的一個問題 n 多的子類繼承自抽象基類,我們不得不在每次要用到子類的地方就編寫諸如 new ×××;的程式碼。這裡帶來兩個問題: 客戶程式設計師必須知道實際子類的名稱(當系統複雜後,命名將是一個很不好處理的問題,為了處理可能的名字衝突,有的命名可能並不是具有很好的可讀性和可記憶性,就姑且不論不同程式設計師千奇百怪的個人偏好了)。程式的擴充套件性和維護變得越來越困難。 * 2.還有一種情況就是在父類中並不知道具體要例項化哪一個具體的子類。這裡的意思為:假設我們在類 A 中要使用到類 B,B 是一個抽象父類,在 A 中並不知道具體要例項化那一個 B 的子類,但是在類 A 的子類 D 中是可以知道的。在 A 中我們沒有辦法直接使用類似於 new ×××的語句,因為根本就不知道×××是什麼。 以上兩個問題也就引出了工廠模式的兩個最重要的功能: 定義建立物件的介面,封裝了物件的建立; 使得具體化類的工作延遲到了子類中。 對於工廠模式,為了使其能更好的解決多種情況的問題,將其分為三類:**簡單工廠模式(Simple Factory),工廠方法模式(Factory Method),抽象工廠模式(Abstract Factory)**。 GOAT 經常使用會遇到一些設計模式的使用,但是很少去細究裡面的區別,這把就讓我來大家分享一下,我認知中的這三種工廠模式。 # 簡單工廠模式 我們把被建立的物件稱為“產品”,把建立產品的物件稱為“工廠”。如果要建立的產品不多,只要一個工廠類就可以完成,這種模式叫“簡單工廠模式”。 ## 結構定義: 是由一個工廠物件決定創建出哪一種產品類的例項。 簡單工廠模式中包含的角色及其相應的職責如下: **工廠角色(Creator)**:這是簡單工廠模式的核心,由它負責建立所有的類的內部邏輯。當然工廠類必須能夠被外界呼叫,建立所需要的產品物件。 **抽象(Product)產品角色**:簡單工廠模式所建立的所有物件的父類,注意,這裡的父類可以是介面也可以是抽象類,它負責描述所有例項所共有的公共介面。 **具體產品(Concrete Product)角色**:簡單工廠所建立的具體例項物件,這些具體的產品往往都擁有共同的父類。 定義一個建立產品物件的工廠介面,將產品物件的實際建立工作推遲到具體子工廠類當中。這滿足建立型模式中所要求的“建立與使用相分離”的特點。 ## 結構圖如下 ![](https://img-blog.csdnimg.cn/2021030320233140.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2x5bjYzMTU3OTc0MQ==,size_16,color_FFFFFF,t_70) ## 範例如下: ### C++實現 ``` #