<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      工廠的那些事兒

        下午考完試了,挺輕松的,不過現在不知道要干嘛了,隨便寫兩句吧,也不知道要取個什么名字,就也時尚一下,叫成《工廠的那些事兒》吧 :)

        既然標題取成了工廠,那就是Factory Pattern了,前段時間看TerryLee大哥的工廠方法的文章,迷惑了幾天,不過在某天早醒來的瞬間,我突然想通了,不過一直沒有時間把它前下來,就趁這會兒有空,把它記錄下來吧。

        First, 貼上TerryLee講工廠方法那篇文章的地址:http://terrylee.cnblogs.com/archive/2006/01/04/310716.html

        下面引用的兩段原文就是曾經引起我疑問的地方了:

      Segment 1在應用程序中,我們要使用某一種日志記錄方式,也許會用到如下這樣的語句:
      EventLog eventlog = new EventLog();
      eventlog.Write();
      當日志記錄的方式從EventLog變化為FileLog,我們就得修改所有程序代碼中出現上面語句的部分,這樣的工作量是可想而知的。

      Segment 2在應用程序中,Log對象的創建是頻繁的,在這里我們可以把
      LogFactory factory = new EventFactory();
      這句話放在一個類模塊中,任何需要用到Log對象的地方仍然不變。要是換一種日志記錄方式,只要修改一處為:
      LogFactory factory = new FileFactory();
      其余的任何地方我們都不需要去修改。

        我曾一直想不通,如果把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.

        
      posted @ 2008-07-06 20:36  水言木  閱讀(3908)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 亚洲成熟女人av在线观看| 亚洲AV日韩精品久久久久| 国产精品美女久久久久久麻豆| 亚洲 校园 欧美 国产 另类| 国产人妻久久精品一区二区三区| 亚洲第一二三区日韩国产| 伊人狠狠色j香婷婷综合| 噜妇插内射精品| 强d乱码中文字幕熟女1000部 | 亚洲一区二区精品另类| 国产熟睡乱子伦视频在线播放| 欧美日韩精品一区二区视频| 国产成人无码精品亚洲| 国产视频一区二区在线看| 四虎永久免费高清视频| 北安市| 国产精品伦人一久二久三久| 亚洲熟女精品一区二区| 塔河县| 四虎国产成人永久精品免费| 亚洲高清WWW色好看美女| 精品国产中文字幕av| 狠狠色噜噜狠狠狠狠2021| 中文亚洲成A人片在线观看| 成人午夜在线观看日韩| 国产精品午夜福利在线观看| 精品无码一区在线观看| 玩弄漂亮少妇高潮白浆| 国产一区二区三区精品综合| 亚洲avav天堂av在线网爱情| 看全色黄大黄大色免费久久| 极品少妇xxxx| 少妇人妻激情乱人伦| 亚洲人成色99999在线观看| 久久亚洲精品中文字幕无| 无码国产偷倩在线播放| 咸丰县| 国产精品一区中文字幕| 国产精品亚洲精品日韩已满十八小| 欧美三级中文字幕在线观看| 国产精欧美一区二区三区|