程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java設計形式之工場形式(Factory形式)引見

Java設計形式之工場形式(Factory形式)引見

編輯:關於JAVA

Java設計形式之工場形式(Factory形式)引見。本站提示廣大學習愛好者:(Java設計形式之工場形式(Factory形式)引見)文章只能為提供參考,不一定能成為您想要的結果。以下是Java設計形式之工場形式(Factory形式)引見正文


工場形式界說:供給創立對象的接口。

為什麼應用工場形式

工場形式是我們最經常使用的形式了,有名的Jive服裝論壇t.vhao.net,就年夜量應用了工場形式,工場形式在Java法式體系可以說是到處可見。

為何工場形式是如斯經常使用?由於工場形式就相當於創立實例對象的new,我們常常要依據類Class生成實例對象,如A a=new A() 工場形式也是用來創立實例對象的,所以今後new時就要多個心眼,能否可以斟酌適用工場形式,固然如許做,能夠多做一些任務,但會給你體系帶來更年夜的可擴大性和盡可能少的修正量。

我們以類Sample為例, 假如我們要創立Sample的實例對象:

    Sample sample=new Sample();

可是,現實情形是,平日我們都要在創立sample實例時做點初始化的任務,好比賦值查詢數據庫等。

起首,我們想到的是,可使用Sample的結構函數,如許生成實例就寫成:

    Sample sample=new Sample(參數);

然則,假如創立sample實例時所做的初始化任務不是象賦值如許簡略的事,能夠是很長一段代碼,假如也寫入結構函數中,那你的代碼很好看了(就須要Refactor重整)。

為何說代碼很好看,初學者能夠沒有這類感到,我們剖析以下,初始化任務假如是很長一段代碼,解釋要做的任務許多,將許多任務裝入一個辦法中,相當於將許多雞蛋放在一個籃子裡,是很風險的,這也是有背於Java面向對象的准繩,面向對象的封裝(Encapsulation)和分配(Delegation)告知我們,盡可能將長的代碼分配“切割”成每段,將每段再“封裝”起來(削減段和段之間巧合接洽性),如許,就會將風險疏散,今後假如須要修正,只需更改每段,不會再產生牽一動百的工作。

在本例中,起首,我們須要將創立實例的任務與應用實例的任務離開,也就是說,讓創立實例所須要的年夜量初始化任務從Sample的結構函數平分離出去。

這時候我們就須要Factory工場形式來生成對象了,不克不及再用下面簡略new Sample(參數)。還有,假如Sample有個繼續如MySample,依照面向接口編程,我們須要將Sample籠統成一個接口。如今Sample是接口,有兩個子類MySample 和HisSample。我們要實例化他們時,以下:

    Sample mysample=new MySample(); Sample hissample=new HisSample();
 
跟著項目標深刻,Sample能夠還會"生出許多兒子出來",那末我們要對這些兒子一個個實例化,更蹩腳的是,能夠還要對之前的代碼停止修正:參加後來生出兒子的實例.這在傳統法式中是沒法防止的。

但假如你一開端就無意識應用了工場形式,這些費事就沒有了。

工場辦法

你會樹立一個專學生產Sample實例的工場:

public class Factory{
    public static Sample creator(int which){
        //getClass 發生Sample 普通可以使用靜態類裝載裝入類。
        if (which==1)
            return new SampleA();
        else if (which==2)
            return new SampleB();
    }
}

那末在你的法式中,假如要實例化Sample時就應用

    Sample sampleA=Factory.creator(1);

如許,在全部就不觸及到Sample的詳細子類,到達封裝後果,也就削減毛病修正的機遇,這個道理可以用很淺顯的話來比方:就是詳細工作做得越多,越輕易范毛病。這每一個做過詳細任務的人都深有領會,相反,官做得越高,說出的話越籠統越籠統,范毛病能夠性就越少。好象我們從編法式中也能悟出人生事理?

應用工場辦法要留意幾個腳色,起首你要界說產物接口,如下面的Sample,產物接口下有Sample接口的完成類,如SampleA,其主要有一個factory類,用來生成產物Sample,以下圖,最左邊是臨盆的對象Sample:


進一步略微龐雜一點,就是在工場類長進行拓展,工場類也有繼續它的完成類concreteFactory了。

籠統工場
工場形式中有:工場辦法(Factory Method)和籠統工場(Abstract Factory)。

這兩個形式差別在於須要創立對象的龐雜水平上。假如我們創立對象的辦法變得龐雜了,如下面工場辦法中是創立一個對象Sample,假如我們還有新的產物接口Sample2。

這裡假定:Sample有兩個concrete類SampleA和SamleB,而Sample2也有兩個concrete類Sample2A和SampleB2,那末,我們就將上例中Factory釀成籠統類,將配合部門封裝在籠統類中,分歧部門應用子類完成,上面就是將上例中的Factory拓展成籠統工場:


public abstract class Factory{
    public abstract Sample creator();
    public abstract Sample2 creator(String name);
}
public class SimpleFactory extends Factory{
    public Sample creator(){ ......... return new SampleA }
    public Sample2 creator(String name){ ......... return new Sample2A }
}
public class BombFactory extends Factory{
    public Sample creator(){ ...... return new SampleB }
    public Sample2 creator(String name){ ...... return new Sample2B }
}

從下面看到兩個工場各自臨盆出一套Sample和Sample2,或許你會疑問,為何我弗成以應用兩個工場辦法來分離臨盆Sample和Sample2?

籠統工場還有別的一個症結要點,是由於 SimpleFactory內,臨盆Sample和臨盆Sample2的辦法之間有必定接洽,所以才要將這兩個辦法綁縛在一個類中,這個工場類有其自己特點,或許制作進程是同一的,好比:制作工藝比擬簡略,所以稱號叫SimpleFactory。

在現實運用中,工場辦法用得比擬多一些,並且是和靜態類裝入器組合在一路運用,

Java工場形式舉例

我們以Jive的ForumFactory為例,這個例子在後面的Singleton形式中我們評論辯論過,如今再評論辯論其工場形式:

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是經由過程數據庫體系寄存服裝論壇t.vhao.net帖子等外容數據,假如願望更改成經由過程文件體系完成,這個工場辦法ForumFactory就供給了供給靜態接口:

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

你可使用本身開辟的創立forum的辦法取代com.jivesoftware.forum.database.DbForumFactory便可以。

在下面的一段代碼中一共用了三種形式,除工場形式外,還有Singleton單態形式,和proxy形式,proxy形式重要用來受權用戶對forum的拜訪,由於拜訪forum有兩種人:一個是注冊用戶一個是旅客guest,那末那末響應的權限就紛歧樣,並且這個權限是貫串全部體系的,是以樹立一個proxy,相似網關的概念,可以很好的到達這個後果。

看看Java寵物店中的CatalogDAOFactory:

public class CatalogDAOFactory {
    /**
      * 本辦法制訂一個特殊的子類來完成DAO形式。
      * 詳細子類界說是在J2EE的安排描寫器中。
    */
        public static CatalogDAO getDAO() throws CatalogDAOSysException{
            CatalogDAO catDao = null;
            try {
                InitialContext ic = new InitialContext();
                //靜態裝入CATALOG_DAO_CLASS
                //可以界說本身的CATALOG_DAO_CLASS,從而在無需變革太多代碼
                //的條件下,完成體系的偉大變革。
                String className =(String) ic.lookup(JNDINames.CATALOG_DAO_CLASS);
                catDao = (CatalogDAO) Class.forName(className).newInstance();
            } catch (NamingException ne) {
                throw new CatalogDAOSysException(" CatalogDAOFactory.getDAO: NamingException while getting DAO type : \n" + ne.getMessage());
            } catch (Exception se) {
                throw new CatalogDAOSysException("CatalogDAOFactory.getDAO: Exception while getting DAO type : \n" + se.getMessage());
           }
           return catDao;
    }
}

CatalogDAOFactory是典范的工場辦法,catDao是經由過程靜態類裝入器className取得CatalogDAOFactory詳細完成子類,這個完成子類在Java寵物店是用來操作catalog數據庫,用戶可以依據數據庫的類型分歧,定制本身的詳細完成子類,將本身的子類名授與CATALOG_DAO_CLASS變量便可以。

因而可知,工場辦法確切為體系構造供給了異常靈巧壯大的靜態擴大機制,只需我們改換一下詳細的工場辦法,體系其他處所無需一點變換,就有能夠將體系功效停止面目一新的變更。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved