工厂方法模式应用场景
工廠方法模式
? ? ? 工廠方法(Factory Method)模式的意義是定義一個創建產品對象的工廠接口,將實際創建工作推遲到子類當中。核心工廠類不再負責產品的創建,這樣核心類成為一個抽象工廠角色,僅負責具體工廠子類必須實現的接口,這樣進一步抽象化的好處是使得工廠方法模式可以使系統在不修改具體工廠角色的情況下引進新的產品。
???? 工廠方法模式是簡單工廠模式的衍生,解決了許多簡單工廠模式的問題。首先完全實現‘開-閉原則’,實現了可擴展。其次更復雜的層次結構,可以應用于產品結果復雜的場合。
? ? ? 首先,我們先介紹簡單工廠模式。
? ? ? 簡單工廠模式是屬于創建型模式,又叫做靜態工廠方法(Static Factory Method)模式,但不屬于23種GOF設計模式之一。簡單工廠模式是由一個工廠對象決定創建出哪一種產品類的實例。簡單工廠模式是工廠模式家族中最簡單實用的模式,可以理解為是不同工廠模式的一個特殊實現。
? ? ? ?下面,我將由具體的實例一步步的引出為什么要用工廠方法模式,以及工廠方法模式解決了哪些問題。
? ? ? ?想象一下,如果讓我們自己實現一個簡單的像 log4j 那樣的日志框架該怎么設計呢?
?
?我們可能這樣做,但這樣做的壞處是什么?
?
public class Log1 {public static void debug(String message){System.out.println(message);} }?
public class Client2 {Logger logger= LoggerFactory.getLogger(Config.LOG_TYPE);public void begin(){logger.debug("log");} }這樣做的壞處就是
有一天,我們想要把我們的應用改為一個更好日志框架,我們蒙了,為什么呢?
因為像? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
Log1 log1=new Log1();這樣的代碼在每個類里面都有一個,我們要每一個都要更改,麻煩不說,還易出錯。
于是我們做了如下改進。簡單工廠模式登場了。?
這樣,我們只需改下配置中的日志類型就可以實現兩種日志間的無縫切換,看起來一切完美。
簡單工廠模式將日志對象的實例化推遲到工廠中,實現了應用和日志對象的實例化的解耦。
但是,簡單工廠模式有什么不足呢?
工廠方法模式又改進了簡單工廠模式的哪些缺點呢?
?
現在,我們又覺得原先的日志框架功能不太好用,我們又想開發一個新的日志框架了。
于是我們又加了一個if else 。如果以后我們又想再加呢?我們還得再寫一個if else 。
像下面這樣
public class LoggerFactory {public static Logger getLogger(String logType){if("Log1".equals(logType)){return new Log1();}if("Log2".equals(logType)){return new Log2();}if("Log3".equals(logType)){return new Log3();}return null;} }我們已經發現問題了,這樣做違反了開閉原則。
于是。。。。。。工廠方法模式登場了
于是我們進一步改進我們的框架,采用工廠方法模式。
?
public class LoggerFactory {private static IFactory iFactory;public static Logger getLogger(){return iFactory.getLogger();} } public interface IFactory {Logger getLogger(); }public class Log1Factory implements IFactory {@Overridepublic Logger getLogger() {return new Log1();} }
這樣,當以后我們再有新的日志框架時
只要這個新的日志框架符合我們的接口定義,實現了Ifactory 接口。我們就只需要為LoggerFactroy 的ifactory 注入這個新的工廠就行了。
注入方式可以是構造方法注入,setter 注入或者讓 Spring 幫我們注入。
不錯,self4j 就是這么一個日志接口的定義。Log4j2 和Logback 都實現了self4j 的接口,所以我們就可以開開心心的在Log4j2 和Logback 以及以后可能出的任何實現self4j 接口的日志框架之間自由切換了。
當然,他們的實現比我們這個簡單的樣例要復雜的多。
而且他們注入工廠是自動掃描工程中實現 self4j接口的實現類來實現,所以只要我們引入相關jar 包就行啦。
總結
以上是生活随笔為你收集整理的工厂方法模式应用场景的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【咸鱼教程】TextureMerger1
- 下一篇: java将html代码格式化,java代