儘管簡單工廠模式實現了對象的建立和使用分離,可是仍然存在如下兩個問題:java
一個更好的辦法是使用工廠方法模式。數據庫
工廠方法模式:定義一個用於建立對象的接口,讓子類決定將哪個類實例化。
工廠方法又簡稱工廠模式或虛擬構造器模式或多態工廠模式,讓一個類的實例化延遲到其子類,是一種類建立型模式。
結構圖以下:ide
工廠方法模式包含如下四個角色:性能
日誌記錄器的設計:該記錄器能夠經過多種途徑保存系統的運行日誌,例如文件記錄或者數據庫記錄。測試
代碼以下:this
public class Test { public static void main(String[] args) { LoggerFactory factory = new FileLoggerFactory(); Logger logger = factory.createLogger(); logger.log(); } } //抽象產品 interface Logger { void log(); } //具體產品:DatabaseLogger class DatabaseLogger implements Logger { public void log() { System.out.println("數據庫日誌記錄"); } } //具體產品:FileLogger class FileLogger implements Logger { public void log() { System.out.println("文件日誌記錄"); } } //抽象工廠 interface LoggerFactory { Logger createLogger(); } //具體工廠:DatabaseLoggerFactory class DatabaseLoggerFactory implements LoggerFactory { public Logger createLogger() { return new DatabaseLogger(); } } //具體工廠:FileLoggerFactory class FileLoggerFactory implements LoggerFactory { public Logger createLogger() { return new FileLogger(); } }
能夠把抽象工廠設置爲抽象類,工廠方法直接能夠對客戶端隱藏,也就是說能夠直接經過抽象工廠調用具體產品類的業務方法,客戶端無需建立具體產品,直接經過工廠類調用便可,代碼修改以下(抽象產品以及具體產品類不用修改):設計
//抽象工廠 abstract class LoggerFactory { public void log() { this.createLogger().log(); } public abstract Logger createLogger(); } //具體工廠:DatabaseLoggerFactory class DatabaseLoggerFactory extends LoggerFactory { public Logger createLogger() { return new DatabaseLogger(); } } //具體工廠:FileLoggerFactory class FileLoggerFactory extends LoggerFactory { public Logger createLogger() { return new FileLogger(); } } public class Test { public static void main(String[] args) { LoggerFactory factory = new FileLoggerFactory(); factory.log(); } }