一、介紹
在工廠模式中,我們在建立物件時不會對客戶端暴露建立邏輯,並且是通過使用乙個共同的介面來指向新建立的物件。
意圖:定義乙個建立物件的介面,讓其子類自己決定例項化哪乙個工廠類,工廠模式使其建立過程延遲到子類進行。
主要解決:主要解決介面選擇的問題。
何時使用:我們明確地計畫不同條件下建立不同例項時。
如何解決:讓其子類實現工廠介面,返回的也是乙個抽象的產品。
關鍵**:建立過程在其子類執行。
應用例項:
1、您需要一輛汽車,可以直接從工廠裡面提貨,而不用去管這輛汽車是怎麼做出來的,以及這個汽車裡面的具體實現。
2、hibernate 換資料庫只需換方言和驅動就可以。
優點:
1、乙個呼叫者想建立乙個物件,只要知道其名稱就可以了。
2、擴充套件性高,如果想增加乙個產品,只要擴充套件乙個工廠類就可以。
3、遮蔽產品的具體實現,呼叫者只關心產品的介面。
缺點:每次增加乙個產品時,都需要增加乙個具體類和物件實現工廠,使得系統中類的個數成倍增加,在一定程度上增加了系統的複雜度,同時也增加了系統具體類的依賴。這並不是什麼好事。
使用場景:
1、日誌記錄器:記錄可能記錄到本地硬碟、系統事件、遠端伺服器等,使用者可以選擇記錄日誌到什麼地方。
2、資料庫訪問,當使用者不知道最後系統採用哪一類資料庫,以及資料庫可能有變化時。
3、設計乙個連線伺服器的框架,需要三個協議,"pop3"、"imap"、"http",可以把這三個作為產品類,共同實現乙個介面。
注意事項:作為一種建立類模式,在任何需要生成複雜物件的地方,都可以使用工廠方法模式。有一點需要注意的地方就是複雜物件適合使用工廠模式,而簡單物件,特別是只需要通過 new 就可以完成建立的物件,無需使用工廠模式。如果使用工廠模式,就需要引入乙個工廠類,會增加系統的複雜度。
二、實現
我們將建立乙個 shape 介面和實現 shape 介面的實體類。下一步是定義工廠類 shapefactory。
factorypatterndemo,我們的演示類使用 shapefactory來獲取 shape 物件。它將向 shapefactory 傳遞資訊(circle / rectangle / square),以便獲取它所需物件的型別。
步驟 1:建立乙個介面
public inte***ce shape
步驟 2:建立實現介面的實體類
步驟 3:建立乙個工廠,生成基於給定資訊的實體類的物件public class rectangle implements shape
}public class square implements shape
}public class circle implements shape
}
步驟 4:使用該工廠,通過傳遞型別資訊來獲取實體類的物件public class shapefactory
if(shapetype.equalsignorecase("circle")) else if(shapetype.equalsignorecase("rectangle")) else if(shapetype.equalsignorecase("square"))
return null;}}
步驟 5:執行程式,輸出結果public class factorypatterndemo
}
inside circle::draw() method.
inside rectangle::draw() method.
inside square::draw() method.
設計模式 設計模式之工廠模式
工廠方法模式 建立模式 使用場景?作用?形態?場景 大量類似的實體類 要建立的實體類都是同一本質的東西 披薩 有部分類似功能 準備 烘烤 切法 實現方式不一樣 準備的材料不同 烘烤時間不同 切法不同 將繁瑣複雜的建立類的過程聚集在一起,有序清晰 把具體例項化的過程從客戶 中抽離 作用 1 將建立物件...
c 設計模式 之 工廠模式之 工廠模式
1 uml類圖 實現和依賴關係 實現 sportfactory jeepfactory hatchbackfactory 實現 ifactory 介面 sportcar jeepcar hatchbackcar 實現 icar 介面 依賴 ifactory 依賴 icar sportfactory ...
設計模式 工廠模式之簡單工廠模式
定義 由乙個工廠物件 工廠類 來指定建立某乙個產品類的例項。使用場景 客戶端只需傳入指定的引數即可,工廠類負責建立的物件較少 因為指定了傳入的引數 介面類 本想用iphone命名的,見諒 public inte ce phone實現介面類 public class huaweiphone imple...