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

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

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

1 日誌記錄器的設計

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

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

       Sunny公司的開發人員通過對該需求進行分析,發現該日誌記錄器有兩個設計要點:

       (1) 需要封裝日誌記錄器的初始化過程,這些初始化工作較為複雜,例如需要初始化其他相關的類,還有可能需要讀取配置檔案(例如連線資料庫或建立檔案),導致程式碼較長,如果將它們都寫在建構函式中,會導致建構函式龐大,不利於程式碼的修改和維護;

       (2) 使用者可能需要更換日誌記錄方式,在客戶端程式碼中需要提供一種靈活的方式來選擇日誌記錄器,儘量在不修改原始碼的基礎上更換或者增加日誌記錄方式。

       Sunny公司開發人員最初使用簡單工廠模式對日誌記錄器進行了設計,初始結構如圖1

所示:

 


基於簡單工廠模式設計的日誌記錄器結構圖

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

  1. //日誌記錄器工廠
  2. class LoggerFactory {  
  3.     //靜態工廠方法
  4.     publicstatic Logger createLogger(String args) {  
  5.         if(args.equalsIgnoreCase("db")) {  
  6.             //連線資料庫,程式碼省略
  7.             //建立資料庫日誌記錄器物件
  8.             Logger logger = new DatabaseLogger();   
  9.             //初始化資料庫日誌記錄器,程式碼省略
  10.             return logger;  
  11.         }  
  12.         elseif(args.equalsIgnoreCase("file")) {  
  13.             //建立日誌檔案
  14.             //建立檔案日誌記錄器物件
  15.             Logger logger = new FileLogger();   
  16.             //初始化檔案日誌記錄器,程式碼省略
  17.             return logger;            
  18.         }  
  19.         else {  
  20.             returnnull;  
  21.         }  
  22.     }  
  23. }  


       為了突出設計重點,我們對上述程式碼進行了簡化,省略了具體日誌記錄器類的初始化程式碼。在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設計模式工廠兄弟工廠方法模式

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