工廠的那些事兒
下午考完試了,挺輕松的,不過現在不知道要干嘛了,隨便寫兩句吧,也不知道要取個什么名字,就也時尚一下,叫成《工廠的那些事兒》吧 :)
既然標題取成了工廠,那就是Factory Pattern了,前段時間看TerryLee大哥的工廠方法的文章,迷惑了幾天,不過在某天早醒來的瞬間,我突然想通了,不過一直沒有時間把它前下來,就趁這會兒有空,把它記錄下來吧。
First, 貼上TerryLee講工廠方法那篇文章的地址:http://terrylee.cnblogs.com/archive/2006/01/04/310716.html
下面引用的兩段原文就是曾經引起我疑問的地方了:
我曾一直想不通,如果把Segment 1中的 EventLog eventlog = new EventLog();改成Log log = new EventLog(),那會跟下面采用了Factory Method的情況會有多大的差別?大家都把變化范圍縮小到了new的那一句,segment 1中只要 new EventLog()后,對后面的代碼而言,都只是持有對抽象的Log的引用,segment 2中也一樣,在后面都是持有對LogFactory這個抽象類的引用,大家的變化都在new的那一行,那引入工廠方法的意義在哪里?為什么TerryLee說Segment1中“這樣的工作量是可想而知的”,而Segment中“只要修改一處”?
帶著這個疑問我用我笨重的大腦想了又想,終于在某一天早上醒來的瞬間想通了(好像我需要反醒我的智商了)。
其實如果僅僅只是new了一個具體的日志類的話,引入工廠方法確實沒有意義,如我的疑問中所說,兩者的修改都只集中在對象的創建那一句,但是,如果我們在程序中需要用到十個不同的日志對象呢?在沒有用工廠方法時,我們就要出現10次的Log log = new EventLog(),于是,依賴就開始在程序中遍布,一旦某天要改成文件日志,那就要在這10處修改,改成Log log = new FileLog()。
而我們看看使用Factory Method的情形,首先創建一個工廠對象LogFactory logfactory = new EventLogFactory(),以后每次需要創建日志對象的時候,我們只需要:Log log = logFactory.Create(),為了得到10個不同的日志對象,我們只需要在創建工廠的那一行代碼中依賴實現,其余地方都是依賴于抽象,一旦某日要換成文件日志,則只要在創建工廠的地方進行改動就可以了,相對于沒有使用工廠方法的程序,耦合度的降低可想而知。
如果在LogFactory logfactory = new EventLogFactory()這里利用反射來創建工廠,那就可以通過修改配置文件實現EventLog和FileLog以及將來要添加的日志記錄器之間的更換,當然,你也可以想到在Segment1中使用反射,但如果這樣的話,我們創建10個日志對象,就得在10個地方寫上反射代碼,而這些代碼都是冗余的。
總結一下,工廠方法引入后到底解決了什么問題?工廠工廠,從空面意思就可以想到,它一定跟創建大量的產品有關,就像上面的Segment1和Segment2,如果程序只需要一個日志對象(Log)就完事兒,那引入工廠方法反而多寫了代碼,沒有意義,但是當要創建多個產品(Log)時,工廠的優勢就出來了,他可以讓耦合隔離到一行代碼中,而Segment1中則不行。
這是工廠方法,還有一種Design Pattern叫做Abstract Factory,大家都跟工廠有關,那也就是說,他們對大批量創建產品(對象)的情況是很有用的,但他跟工廠方法又不同,如上所述,工廠方法生產來生產去也就生產出了一種產品――日志對象,而抽象工廠相對于它,不同的地方就在于抽象工廠可以生廠“一系列”的產品,和和,看來抽象工廠的規模比較大,廠長也比較有錢咯。
就像工廠方法一樣,如果只是創建一個實例,工廠就沒有什么太大意義(要是只創建一個,我自己手工做就好了,何必要去蓋一個工廠來呢?錢太多了么?),抽象工廠的外觀就像下面這樣:
public abstract Factory {
public AbstractProductA CreateProductA();
public AbstractProductB CreateProductB();
public AbstractProductC CreateProductC();
//… …
}
當然,各種的Product不能完全沒有關系,要不然把牛頭和馬嘴放到一個工廠類中去生產,那好像就有點對不起“高內聚”大哥了哈。
之后,要創建產品時,只要new一個繼承了Factory的具體工廠,再不停的CreateProduct*(),就可以得到許多的產品了。
總結一句,工廠方法和抽象工廠,前者只生產一種產品,而后者是生產一個產品系列。當然,如果本身產品種類就是多變的,今天要讓工廠會生產ProductE,后天又要讓工廠會生廠ProductM,那抽象工廠也無能為力了。
THE END.

既然標題取成了工廠,那就是Factory Pattern了,前段時間看TerryLee大哥的工廠方法的文章,迷惑了幾天,不過在某天早醒來的瞬間,我突然想通了,不過一直沒有時間把它前下來,就趁這會兒有空,把它記錄下來吧。
First, 貼上TerryLee講工廠方法那篇文章的地址:http://terrylee.cnblogs.com/archive/2006/01/04/310716.html
下面引用的兩段原文就是曾經引起我疑問的地方了:
我曾一直想不通,如果把Segment 1中的 EventLog eventlog = new EventLog();改成Log log = new EventLog(),那會跟下面采用了Factory Method的情況會有多大的差別?大家都把變化范圍縮小到了new的那一句,segment 1中只要 new EventLog()后,對后面的代碼而言,都只是持有對抽象的Log的引用,segment 2中也一樣,在后面都是持有對LogFactory這個抽象類的引用,大家的變化都在new的那一行,那引入工廠方法的意義在哪里?為什么TerryLee說Segment1中“這樣的工作量是可想而知的”,而Segment中“只要修改一處”?
帶著這個疑問我用我笨重的大腦想了又想,終于在某一天早上醒來的瞬間想通了(好像我需要反醒我的智商了)。
其實如果僅僅只是new了一個具體的日志類的話,引入工廠方法確實沒有意義,如我的疑問中所說,兩者的修改都只集中在對象的創建那一句,但是,如果我們在程序中需要用到十個不同的日志對象呢?在沒有用工廠方法時,我們就要出現10次的Log log = new EventLog(),于是,依賴就開始在程序中遍布,一旦某天要改成文件日志,那就要在這10處修改,改成Log log = new FileLog()。
而我們看看使用Factory Method的情形,首先創建一個工廠對象LogFactory logfactory = new EventLogFactory(),以后每次需要創建日志對象的時候,我們只需要:Log log = logFactory.Create(),為了得到10個不同的日志對象,我們只需要在創建工廠的那一行代碼中依賴實現,其余地方都是依賴于抽象,一旦某日要換成文件日志,則只要在創建工廠的地方進行改動就可以了,相對于沒有使用工廠方法的程序,耦合度的降低可想而知。
如果在LogFactory logfactory = new EventLogFactory()這里利用反射來創建工廠,那就可以通過修改配置文件實現EventLog和FileLog以及將來要添加的日志記錄器之間的更換,當然,你也可以想到在Segment1中使用反射,但如果這樣的話,我們創建10個日志對象,就得在10個地方寫上反射代碼,而這些代碼都是冗余的。
總結一下,工廠方法引入后到底解決了什么問題?工廠工廠,從空面意思就可以想到,它一定跟創建大量的產品有關,就像上面的Segment1和Segment2,如果程序只需要一個日志對象(Log)就完事兒,那引入工廠方法反而多寫了代碼,沒有意義,但是當要創建多個產品(Log)時,工廠的優勢就出來了,他可以讓耦合隔離到一行代碼中,而Segment1中則不行。
這是工廠方法,還有一種Design Pattern叫做Abstract Factory,大家都跟工廠有關,那也就是說,他們對大批量創建產品(對象)的情況是很有用的,但他跟工廠方法又不同,如上所述,工廠方法生產來生產去也就生產出了一種產品――日志對象,而抽象工廠相對于它,不同的地方就在于抽象工廠可以生廠“一系列”的產品,和和,看來抽象工廠的規模比較大,廠長也比較有錢咯。
就像工廠方法一樣,如果只是創建一個實例,工廠就沒有什么太大意義(要是只創建一個,我自己手工做就好了,何必要去蓋一個工廠來呢?錢太多了么?),抽象工廠的外觀就像下面這樣:
public abstract Factory {
public AbstractProductA CreateProductA();
public AbstractProductB CreateProductB();
public AbstractProductC CreateProductC();
//… …
}當然,各種的Product不能完全沒有關系,要不然把牛頭和馬嘴放到一個工廠類中去生產,那好像就有點對不起“高內聚”大哥了哈。
之后,要創建產品時,只要new一個繼承了Factory的具體工廠,再不停的CreateProduct*(),就可以得到許多的產品了。
總結一句,工廠方法和抽象工廠,前者只生產一種產品,而后者是生產一個產品系列。當然,如果本身產品種類就是多變的,今天要讓工廠會生產ProductE,后天又要讓工廠會生廠ProductM,那抽象工廠也無能為力了。
THE END.


浙公網安備 33010602011771號