1. 程式人生 > >工廠三兄弟之工廠方法模式(一):日誌記錄器的設計

工廠三兄弟之工廠方法模式(一):日誌記錄器的設計

簡單工廠模式雖然簡單,但存在一個很嚴重的問題。當系統中需要引入新產品時,由於靜態工廠方法通過所傳入引數的不同來建立不同的產品,這必定要修改工廠類的原始碼,將違背“開閉原則”,如何實現增加新產品而不影響已有程式碼?工廠方法模式應運而生,本文將介紹第二種工廠模式——工廠方法模式。

1 日誌記錄器的設計

——————————————————————————————————
Sunny軟體公司欲開發一個系統執行日誌記錄器(Logger),該記錄器可以通過多種途徑儲存系統的執行日誌,如通過檔案記錄或資料庫記錄,使用者可以通過修改配置檔案靈活地更換日誌記錄方式。在設計各類日誌記錄器時,Sunny公司的開發人員發現需要對日誌記錄器進行一些初始化工作,初始化引數的設定過程較為複雜,而且某些引數的設定有嚴格的先後次序,否則可能會發生記錄失敗。如何封裝記錄器的初始化過程並保證多種記錄器切換的靈活性

是Sunny公司開發人員面臨的一個難題。

Sunny公司的開發人員通過對該需求進行分析,發現該日誌記錄器有兩個設計要點
(1) 需要封裝日誌記錄器的初始化過程,這些初始化工作較為複雜,例如需要初始化其他相關的類,還有可能需要讀取配置檔案(例如連線資料庫或建立檔案),導致程式碼較長,如果將它們都寫在建構函式中,會導致建構函式龐大,不利於程式碼的修改和維護;
(2) 使用者可能需要更換日誌記錄方式,在客戶端程式碼中需要提供一種靈活的方式來選擇日誌記錄器,儘量在不修改原始碼的基礎上更換或者增加日誌記錄方式。

Sunny公司開發人員最初使用簡單工廠模式對日誌記錄器進行了設計,初始結構如圖1所示:
這裡寫圖片描述

在圖1中,LoggerFactory充當建立日誌記錄器的工廠,提供了工廠方法createLogger()用於建立日誌記錄器,Logger是抽象日誌記錄器介面,其子類為具體日誌記錄器。其中,工廠類LoggerFactory程式碼片段如下所示:

//日誌記錄器工廠
class LoggerFactory {
    //靜態工廠方法
    public static Logger createLogger(String args) {
        if(args.equalsIgnoreCase("db")) {
            //連線資料庫,程式碼省略
            //建立資料庫日誌記錄器物件
Logger logger = new DatabaseLogger(); //初始化資料庫日誌記錄器,程式碼省略 return logger; } else if(args.equalsIgnoreCase("file")) { //建立日誌檔案 //建立檔案日誌記錄器物件 Logger logger = new FileLogger(); //初始化檔案日誌記錄器,程式碼省略 return logger; } else { return null; } } }

為了突出設計重點,我們對上述程式碼進行了簡化,省略了具體日誌記錄器類的初始化程式碼。在LoggerFactory類中提供了靜態工廠方法createLogger(),用於根據所傳入的引數建立各種不同型別的日誌記錄器。通過使用簡單工廠模式,我們將日誌記錄器物件的建立和使用分離,客戶端只需使用由工廠類建立的日誌記錄器物件即可,無須關心物件的建立過程,但是我們發現,雖然簡單工廠模式實現了物件的建立和使用分離,但是仍然存在如下兩個問題:

(1) 工廠類過於龐大,包含了大量的if…else…程式碼,導致維護和測試難度增大;
(2) 系統擴充套件不靈活,如果增加新型別的日誌記錄器,必須修改靜態工廠方法的業務邏輯,違反了“開閉原則”。

如何解決這兩個問題,提供一種簡單工廠模式的改進方案?這就是本文所介紹的工廠方法模式的動機之一。

相關推薦

工廠兄弟工廠方法模式日誌記錄設計

簡單工廠模式雖然簡單,但存在一個很嚴重的問題。當系統中需要引入新產品時,由於靜態工廠方法通過所傳入引數的不同來建立不同的產品,這必定要修改工廠類的原始碼,將違背“開閉原則”,如何實現增加新產品而不影響已有程式碼?工廠方法模式應運而生,本文將介紹第二種工廠模式——

工廠方法模式-Factory Method Pattern 工廠兄弟工廠方法模式日誌記錄設計

簡單工廠模式雖然簡單,但存在一個很嚴重的問題。當系統中需要引入新產品時,由於靜態工廠方法通過所傳入引數的不同來建立不同的產品,這必定要修改工廠類的原始碼,將違背“開閉原則”,如何實現增加新產品而不影

設計模式模板方法模式

學習了前面的朋友都知道,目前為止,我們的議題都是繞著封裝轉;我們已經封裝了物件建立、方法呼叫、複雜介面、鴨子、比薩...那接下來呢? 我們將要深入封裝演算法塊、好讓子類可以在任何時候都可以將自己掛接進運算裡。我們甚至會在這裡學到一個受好萊塢影響而啟發的設計原則。 喝點咖啡或茶飲 有些人喜歡喝咖啡,沒有咖啡感覺

工廠兄弟工廠方法模式

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

工廠兄弟工廠方法模式

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

工廠兄弟工廠方法模式

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

工廠方法模式-Factory Method Pattern 工廠兄弟工廠方法模式工廠方法模式概述

2 工廠方法模式概述        在簡單工廠模式中只提供一個工廠類,該工廠類處於對產品類進行例項化的中心位置,它需要知道每一個產品物件的建立細節,並決定何時例項化哪一個產品類。簡單工廠模式最大的

工廠兄弟工廠方法模式日誌記錄工廠方法模式解決方案

3 完整解決方案 Sunny公司開發人員決定使用工廠方法模式來設計日誌記錄器,其基本結構如圖3所示: 在圖3中,Logger介面充當抽象產品,其子類FileLogger和DatabaseLogger充當具體產品,LoggerFactory介面充當抽象工廠

工廠方法模式-Factory Method Pattern 工廠兄弟工廠方法模式過載的工廠方法工廠方法的隱藏,工廠方法模式總結

5 過載的工廠方法        Sunny公司開發人員通過進一步分析,發現可以通過多種方式來初始化日誌記錄器,例如可以為各種日誌記錄器提供預設實現;還可以為資料庫日誌記錄器提供資料庫連線字串,為檔

java設計模式工廠兄弟工廠方法模式

【學習難度:★★☆☆☆,使用頻率:★★★★★】簡單工廠模式雖然簡單,但存在一個很嚴重的問題。當系統中需要引入新產品時,由於靜態工廠方法通過所傳入引數的不同來建立不同的產品,這必定要修改工廠類的原始碼,將違背“開閉原則”,如何實現增加新產品而不影響已有程式碼?工廠方法模式應運而

設計模式模板方法模式TemplateMethod

pla AR 應用 blog public ood 操作 () eal 模板方法模式使用繼承來實現模式的功能,在基類使用一個方法來定義算法的各個步驟,這些步驟(方法)的具體實現會放到子類中,通過這樣來實現不同算法對象的算法拼合,完成該對象整體算法的實現。 作用 模板方法

Java 設計模式簡單工廠模式

參考連結:簡單工廠模式-Simple Factory Pattern 1. 模式概述 定義:定義一個工廠類,它可以根據引數的不同返回不同類的例項,被建立的例項通常都具有共同的父類。因為在簡單工廠模式中用於建立例項的方法是靜態方法,因此簡單工廠模式又被稱為靜態工廠方法模式。 簡

淺談java 23種設計模式模板方法模式Template

模板方法模式:模板方法模式是類的行為模式的一種,符合開閉原則(對擴充套件開放,對修改關閉)。父類提取子類公共方法,並提供若干抽象方法供子類實現,以減少子類中的重複程式碼,並提高可複用性。示例:1.建立一個父類bird,每天只有吃和睡才能生活,但是必須要先進行吃,然後再進行睡:

設計模式模板方法模式Template

           模板方法模式定義一個操作中的演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。 何時應用: 1、需要一次性實現演算法的不變部分,並

Spring中的設計模式工廠模式

一、工廠模式 場景:以牛奶為例,有蒙牛、伊利、愛慕希等品牌。 public interface Milk { /** * 獲得一種牛奶產品 * @return */ String getName(); } 產品實現介面:

Java設計模式觀察者模式

觀察者模式:Observer           觀察者模式主要用於1:N的通知,當一個物件(目標物件subject或Observable)的狀態變化時,他需要及時告知一系列物件(觀察者Observer),令他們做出相應           通知觀察者的方式有兩種,分

初級前端面試

初來深圳 本來決定的是6.29就是週五的時候來深圳。突如其來的一個電話面試,我就提前過去了面試時間是週五上午10點。自信滿滿的自己覺得如果給我一次機會我就一定可以抓住。我覺得作為一個實習生自己已經完全可以勝任。 6.29上午匯才軟體深圳民治分公司 面對

Mysql叢集的HA原理及配置指南主備模式

最近手頭上專案很多,所以部落格這邊耽誤了2個月實在抱歉。 先說說最近搭專案的感受吧: 給一家做網際網路金融的集團公司上私有云,方案用的都是主流的HA高可用方案,沒有什麼特別的,第一期是十臺伺服器(7臺計算節點),現在部署了線上服務的虛擬機器差不多接近60臺,總體來說比較穩定

Java設計模式結構型模式

在解決了物件的建立問題之後,物件的組成以及物件之間的依賴關係就成了開發人員關注的焦點,因為如何設計物件的結構、繼承和依賴關係會影響到後續程式的維護性、程式碼的健壯性、耦合性等。 一、介面卡模式(Adapter) 介面卡模式是指“將一個類的介面轉換成客戶希

資料結構程式效能檢測種排序演算法·對比

先上程式碼: #include<stdio.h> #include<time.h> # define MAX_SIZE 1001 void sort(int *a, int n); void sort2(int *a, int n)