六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

設計模式之Factory

[摘要]定義:提供創建對象的接口.為何使用?工廠模式是我們最常用的模式了,著名的Jive論壇系統,就大量使用了工廠模式.為什么說工廠模式是最常用,因為工廠模式就相當于創建對象的new. 工廠模式就是用來創建對象的.比如我們有一個類Sample 我們要創建Sample的對象:Sample sample=ne...
定義:提供創建對象的接口.

為何使用?
工廠模式是我們最常用的模式了,著名的Jive論壇系統,就大量使用了工廠模式.

為什么說工廠模式是最常用,因為工廠模式就相當于創建對象的new. 工廠模式就是用來創建對象的.

比如我們有一個類Sample 我們要創建Sample的對象:

Sample sample=new Sample();

如果我們要在創建sample之前做點事情,比如,賦值等,可以使用Sample的構造函數:

Sample sample=new Sample(參數);

如果創建sample時做的事情不是如賦值這樣簡單的事,可能是很長一段代碼,如果也寫入構造函數中,那明顯的就違背了面向對象的原則.封裝(Encapsulation)和分派(Delegation);

我們需要將創建實例的責任與使用實例的責任分開, 使得語句

Sample sample=new Sample(參數);

就是簡單的責任:使用Sample這個實例;至于創建Sample的任務就交給了Factory工廠模式.

還有,如果Sample有個繼承如MySample, 按照面向接口編程,我們需要將Sample抽象成一個接口.

現在Sample是接口,有兩個子類MySample 和HisSample .我們要實例化他們時,如下:

Sample mysample=new MySample();
Sample hissample=new HisSample();

隨著項目的深入,Sample可能還會"生出很多兒子出來", 那么我們要對這些兒子一個個實例化,更糟糕的是,可能還要對以前的代碼進行修改:加入后來生出兒子的實例.這在傳統程序中是無法避免的.

但如果你一開始就有意識使用了工廠模式,這些麻煩就沒有了.

你會建立一個專門生產Sample實例的工廠:

public class Factory{

  public static Sample creator(){

  ....
  if (which==1)
    return new MySample();
  else if (which==2)
    return new HisSample();

  }

}




那么在你的程序中,如果要實例化MySample時.就使用

Sample sample=Factory.creator();

這樣,在整個就不涉及到Sample的具體子類,達到封裝效果,也就減少錯誤修改的機會,這個原理可以用很通俗的話來比喻:就是具體事情做得越多,越容易范錯誤.這每個做過具體工作的人都深有體會,相反,官做得越高,說出的話越抽象越籠統,范錯誤可能性就越少.好象我們從編程序中也能悟出人生道理?呵呵.

好了,言歸正傳,既然不可避免使用factory,那我們就認識一下工廠模式.

如何使用?
工廠模式中有: 簡單工廠 工廠方法(Factory Method) 抽象工廠(Abstract Factory).


上例中,我們使用的是簡單工廠. 這幾個模式沒有很明顯的區別,在我的概念中,簡單工廠應該是只有一個工廠方法,如果我們創建對象的方法變得復雜了,我們就可能要將上例中Factory變成抽象類,將共同部分封裝在抽象類中,不同部分使用子類實現:



public abstract class Factory{

  public abstract Sample creator();


  public abstract Sample2 creator();

}

public class SimpleFactory extends Factory{

  public Sample creator(){
    ......
  }

  public Sample2 creator(){
    ......
  }


}

public class BombFactory extends Factory{

  public Sample creator(){
    ......
  }

  public Sample2 creator(){
    ......
  }



}




上例中我們只有一類產品接口 Sample , 工廠方法和抽象工廠可以創建多個產品接口的實例,比如Sample2 Sample3
FactoryMethod往往只是創建單個的實例。Abstract Factory創建一系列的實例組,這些實例彼此相關。

舉例1

下圖是抽象工廠圖:


在這張圖中, 有兩類產品接口interface RAM 和interface CPU; 同時有兩個創建方法:MacProducer和PCProducer,這兩個創建方法中都有createCPU()和createRAM(),返回的實例對象組是CPU和RAM, 這是分別來自兩類產品接口,表面彼此是相關的.因此它是抽象工廠.

舉例2

我們以Jive的ForumFactory為例:

public abstract class ForumFactory {

  private static Object initLock = new Object();
  private static String className = "com.jivesoftware.forum.database.DbForumFactory";
  private static ForumFactory factory = null;

  public static ForumFactory getInstance(Authorization authorization) {
    //If no valid authorization passed in, return null.
    if (authorization == null) {
      return null;
    }
    //以下使用了Singleton 單態模式
    if (factory == null) {
      synchronized(initLock) {
        if (factory == null) {
            ......

          try {
              //動態轉載類
              Class c = Class.forName(className);
              factory = (ForumFactory)c.newInstance();
          }
          catch (Exception e) {
              return null;
          }
        }
      }
    }


    //Now, 返回 proxy.用來限制授權對forum的訪問
    return new ForumFactoryProxy(authorization, factory,
                    factory.getPermissions(authorization));
  }

  //真正創建forum的方法由繼承forumfactory的子類去完成.
  public abstract Forum createForum(String name, String description)
  throws UnauthorizedException, ForumAlreadyExistsException;

  ....


}






因為現在的Jive是通過數據庫系統存放論壇帖子等內容數據,如果有人要擴展為純粹的文件系統存放的論壇帖子,這個工廠方法ForumFactory就提供了提供動態接口:

private static String className = "com.jivesoftware.forum.database.DbForumFactory";

你可以使用自己開發的創建forum的方法代替com.jivesoftware.forum.database.DbForumFactory就可以.

在上面的一段代碼中一共用了三種模式,除了工廠模式外,還有Singleton單態模式,以及proxy模式,proxy模式主要用來授權用戶對forum的訪問,因為訪問forum有兩種人:一個是注冊用戶 一個是游客guest,那么那么相應的權限就不一樣,而且這個權限是貫穿整個系統的,因此建立一個proxy,類似網關的概念,可以很好的達到這個效果.

好了.經過上述簡單描述,你對工廠模式應該有個簡單的印象,如果你要鉆研工廠模式,網絡上有很多英文資料,不過我覺得過分鉆研也沒有必要,主要是使用實踐,實際使用中工廠模式的變種很多,只要你知道這樣一個大概思路,相信在實踐中你會是工廠模式的設計創建高手!



主站蜘蛛池模板: 中文字幕视频在线观看 | 午夜久久精品 | 伊人网综合在线观看 | 天天躁天天弄天天爱 | 天天干天天玩天天操 | 亚洲欧美一级视频 | 四虎国产精品永久地址51 | 天堂网在线资源www最新版 | 在线欧美不卡 | 亚洲日本天堂在线 | 日本夜夜操 | 青娱乐极品视频在线 | 亚洲福利网址 | 青春草在线视频精品 | 啪啪天堂| 亚洲欧美日韩国产综合久 | 亚洲欧洲色天使日韩精品 | 天天干天天插天天 | 四虎国产精品免费久久影院 | 欧美中文字幕在线播放 | 天天碰人人 | 中文字幕精品一区影音先锋 | 热の综合热の国产热の潮小说 | 欧美偷拍小视频 | 日韩在线观看一区二区三区 | 日本 亚洲 欧美 | 天堂中文网 | 在线观看午夜视频 | 色综合久久婷婷天天 | 亚洲第一色区 | 亚洲国产日韩欧美在线 | 天天操天天爽天天射 | 青娱乐国产盛宴 | 亚洲精品乱码久久久久久中文字幕 | 色综合成人网 | 日本一区二区不卡视频 | 在线激情 | 亚洲国产精品久久婷婷 | 亚洲波多野结衣日韩在线 | 欧美一级淫片aaaaaaa视频 | 青青草97|