工廠方法模式-Factory Method Pattern 工廠三兄弟之工廠方法模式(一):日誌記錄器的設計
簡單工廠模式雖然簡單,但存在一個很嚴重的問題。當系統中需要引入新產品時,由於靜態工廠方法通過所傳入引數的不同來建立不同的產品,這必定要修改工廠類的原始碼,將違背“開閉原則”,如何實現增加新產品而不影響已有程式碼?工廠方法模式應運而生,本文將介紹第二種工廠模式——工廠方法模式。
1 日誌記錄器的設計
Sunny軟體公司欲開發一個系統執行日誌記錄器(Logger),該記錄器可以通過多種途徑儲存系統的執行日誌,如通過檔案記錄或資料庫記錄,使用者可以通過修改配置檔案靈活地更換日誌記錄方式。在設計各類日誌記錄器時,Sunny公司的開發人員發現需要對日誌記錄器進行一些初始化工作,初始化引數的設定過程較為複雜,而且某些引數的設定有嚴格的先後次序,否則可能會發生記錄失敗。如何封裝記錄器的初始化過程並保證多種記錄器切換的靈活性是Sunny |
Sunny公司的開發人員通過對該需求進行分析,發現該日誌記錄器有兩個設計要點:
(1) 需要封裝日誌記錄器的初始化過程,這些初始化工作較為複雜,例如需要初始化其他相關的類,還有可能需要讀取配置檔案(例如連線資料庫或建立檔案),導致程式碼較長,如果將它們都寫在建構函式中,會導致建構函式龐大,不利於程式碼的修改和維護;
(2) 使用者可能需要更換日誌記錄方式,在客戶端程式碼中需要提供一種靈活的方式來選擇日誌記錄器,儘量在不修改原始碼的基礎上更換或者增加日誌記錄方式。
Sunny公司開發人員最初使用簡單工廠模式對日誌記錄器進行了設計,初始結構如圖1
圖1 基於簡單工廠模式設計的日誌記錄器結構圖
在圖1中,LoggerFactory充當建立日誌記錄器的工廠,提供了工廠方法createLogger()用於建立日誌記錄器,Logger是抽象日誌記錄器介面,其子類為具體日誌記錄器。其中,工廠類LoggerFactory程式碼片段如下所示:
- //日誌記錄器工廠
- class LoggerFactory {
- //靜態工廠方法
- publicstatic Logger createLogger(String args) {
-
if(args.equalsIgnoreCase("db")) {
- //連線資料庫,程式碼省略
- //建立資料庫日誌記錄器物件
- Logger logger = new DatabaseLogger();
- //初始化資料庫日誌記錄器,程式碼省略
- return logger;
- }
- elseif(args.equalsIgnoreCase("file")) {
- //建立日誌檔案
- //建立檔案日誌記錄器物件
- Logger logger = new FileLogger();
- //初始化檔案日誌記錄器,程式碼省略
- return logger;
- }
- else {
- returnnull;
- }
- }
- }
為了突出設計重點,我們對上述程式碼進行了簡化,省略了具體日誌記錄器類的初始化程式碼。在LoggerFactory類中提供了靜態工廠方法createLogger(),用於根據所傳入的引數建立各種不同型別的日誌記錄器。通過使用簡單工廠模式,我們將日誌記錄器物件的建立和使用分離,客戶端只需使用由工廠類建立的日誌記錄器物件即可,無須關心物件的建立過程,但是我們發現,雖然簡單工廠模式實現了物件的建立和使用分離,但是仍然存在如下兩個問題:
(1) 工廠類過於龐大,包含了大量的if…else…程式碼,導致維護和測試難度增大;
(2) 系統擴充套件不靈活,如果增加新型別的日誌記錄器,必須修改靜態工廠方法的業務邏輯,違反了“開閉原則”。
如何解決這兩個問題,提供一種簡單工廠模式的改進方案?這就是本文所介紹的工廠方法模式的動機之一。
相關推薦
工廠方法模式-Factory Method Pattern 工廠三兄弟之工廠方法模式(一):日誌記錄器的設計
簡單工廠模式雖然簡單,但存在一個很嚴重的問題。當系統中需要引入新產品時,由於靜態工廠方法通過所傳入引數的不同來建立不同的產品,這必定要修改工廠類的原始碼,將違背“開閉原則”,如何實現增加新產品而不影
工廠三兄弟之工廠方法模式(一):日誌記錄器的設計
簡單工廠模式雖然簡單,但存在一個很嚴重的問題。當系統中需要引入新產品時,由於靜態工廠方法通過所傳入引數的不同來建立不同的產品,這必定要修改工廠類的原始碼,將違背“開閉原則”,如何實現增加新產品而不影響已有程式碼?工廠方法模式應運而生,本文將介紹第二種工廠模式——
工廠三兄弟之工廠方法模式(三):日誌記錄器的工廠方法模式解決方案
3 完整解決方案 Sunny公司開發人員決定使用工廠方法模式來設計日誌記錄器,其基本結構如圖3所示: 在圖3中,Logger介面充當抽象產品,其子類FileLogger和DatabaseLogger充當具體產品,LoggerFactory介面充當抽象工廠
大三末之初級前端面試(一)
初來深圳 本來決定的是6.29就是週五的時候來深圳。突如其來的一個電話面試,我就提前過去了面試時間是週五上午10點。自信滿滿的自己覺得如果給我一次機會我就一定可以抓住。我覺得作為一個實習生自己已經完全可以勝任。 6.29上午匯才軟體深圳民治分公司 面對
資料結構之程式效能檢測(一):三種排序演算法·對比
先上程式碼: #include<stdio.h> #include<time.h> # define MAX_SIZE 1001 void sort(int *a, int n); void sort2(int *a, int n)
工廠方法模式-Factory Method Pattern 工廠三兄弟之工廠方法模式(二):工廠方法模式概述
2 工廠方法模式概述 在簡單工廠模式中只提供一個工廠類,該工廠類處於對產品類進行例項化的中心位置,它需要知道每一個產品物件的建立細節,並決定何時例項化哪一個產品類。簡單工廠模式最大的
工廠方法模式-Factory Method Pattern 工廠三兄弟之工廠方法模式(四):過載的工廠方法,工廠方法的隱藏,工廠方法模式總結
5 過載的工廠方法 Sunny公司開發人員通過進一步分析,發現可以通過多種方式來初始化日誌記錄器,例如可以為各種日誌記錄器提供預設實現;還可以為資料庫日誌記錄器提供資料庫連線字串,為檔
設計模式之六:工廠方法模式(Factory method Pattern)
image bsp turn stat ole ati ace 方法 系統擴展 工廠方法(Factory Method)模式就是定義一個創建對象的工廠接口,將實際創建工作推遲到子類當中。 核心工廠類不再負責具體產品的創建,僅提供了具體工廠子類必須實現的接口,這樣核
工廠模式--工廠方法模式(Factory Method Pattern)
邏輯 read oge use 推廣 stat adt 包括 TP 2.1. 模式動機 現在對該系統進行修改,不再設計一個按鈕工廠類來統一負責所有產品的創建,而是將具體按鈕的創建過程交給專門的工廠子類去完成,我們先定義一個抽象的按鈕工廠類,再定義具體的工廠類來生成圓形按鈕
設計模式之工廠方法模式(Factory Method Pattern)
2. 工廠方法模式(Factory Method Pattern) 目錄 工廠方法模式(Factory Method Pattern) 模式動機 模式定義 模式結構 時序圖 程式碼分析 模式分析 例項
用心理解設計模式——工廠方法模式 (Factory Method Pattern)
前置文章: 用心理解設計模式——設計模式的原則 設計模式相關程式碼已統一放至 我的 Github 一、定義 建立型模式之一。 Define an interface for creating an object, b
sincerit 工廠方法模式(Factory Method Pattern)
工廠方法模式(Factory Method Pattern) 工廠方法模式:定義了一個用於建立物件的介面,讓子類決定例項化哪一個類, 工廠方法使一個類的例項化延遲到其子類 工廠方法模式:需要一個Creator介面類,一個Product介面類,Creator的具體子類,Product的具體子類
工廠方法模式(Factory Method Pattern)
工廠方法簡介: 工廠方法(Factory Method)模式的意義是定義一個建立產品物件的工廠介面,將實際建立工作推遲到子類當中。核心工廠類不再負責產品的建立,這樣核心類成為一個抽象工廠角色,僅負責具體工廠子類必須實現的介面,這樣進一步抽象化的好處是使得工廠方法模式可以使系
C++工廠方法模式(Factory Method Pattern)
#ifndef LOGGER_H #define LOGGER_H #include <iostream> #include <string> class Logger {
設計模式-工廠方法模式(Factory Method Pattern)
工廠方法模式(Factory Method):將建立一個產品的任務,推遲到子類中。核心工廠類不再負責產品的建立。 這樣核心類成為一個抽象工廠。負責具體子類工廠必須實現的介面。這樣的好處是在不改變具體子類工廠的前提下 增加新的產品。 工廠方法模式角色與結構: 抽象工廠角色(
設計模式-03工廠方法模式(Factory Method Pattern)
插曲.簡單工廠模式(Simple Factory Pattern) 介紹工廠方法模式之前,先來做一個鋪墊,瞭解一下簡單工廠模式,它不屬於 GoF 的 23 種經典設計模式,它的缺點是增加新產品時會違背“開閉原則”。 1.模式動機 考慮一個簡單的軟體應用場景,一個軟體系統可以提供多個外觀不同的按鈕(如圓形按鈕、
工廠三兄弟之工廠方法模式(二)
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
工廠三兄弟之工廠方法模式(三)
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
工廠三兄弟之工廠方法模式(一)
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
java之設計模式工廠三兄弟之工廠方法模式
【學習難度:★★☆☆☆,使用頻率:★★★★★】簡單工廠模式雖然簡單,但存在一個很嚴重的問題。當系統中需要引入新產品時,由於靜態工廠方法通過所傳入引數的不同來建立不同的產品,這必定要修改工廠類的原始碼,將違背“開閉原則”,如何實現增加新產品而不影響已有程式碼?工廠方法模式應運而