成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

工廠模式和“萬(wàn)能”工廠類

LancerComet / 877人閱讀

摘要:如下工廠類文件我們可以發(fā)現(xiàn),通過(guò)工廠類的包裝,在調(diào)用工廠類方法構(gòu)造對(duì)象時(shí)可以十分輕松地完成任務(wù),而后面的其他任務(wù)則交由工廠類的靜態(tài)代碼塊完成。因此我們考慮把這部分代碼寫(xiě)入工廠類,再生產(chǎn)過(guò)程前進(jìn)行判斷,過(guò)程封裝進(jìn)工廠類。

  

需要構(gòu)造一個(gè)類的對(duì)象,我們通常會(huì)用new的方法來(lái)構(gòu)造:

A a = new A();
  

但是如果隨著這個(gè)對(duì)象被創(chuàng)建的同時(shí)還必須進(jìn)行其他相對(duì)復(fù)雜的操作,那么在新建構(gòu)造一個(gè)對(duì)象代碼就顯得非常復(fù)雜,這個(gè)復(fù)雜的代碼通常還需要每一次都復(fù)寫(xiě),大大增加了冗余。

因此我們構(gòu)造了生產(chǎn)這個(gè)類對(duì)應(yīng)對(duì)象的工廠,用工廠的方法來(lái)生產(chǎn)對(duì)象。
比如:我們需要在構(gòu)造一個(gè)對(duì)象時(shí)并不知道這個(gè)對(duì)象中的某個(gè)字段的確切值,該值保存在配置文件中,所以每次構(gòu)造對(duì)象都要進(jìn)行配置文件的讀取,依據(jù)配置文件中的內(nèi)容來(lái)確定這個(gè)對(duì)象中該字段的信息,這個(gè)過(guò)程如果直接使用new來(lái)實(shí)現(xiàn)將會(huì)造成大量代碼的冗余,大量冗余存在于配置文件的加載和讀取,不妨把它封裝成工廠類,在工廠類內(nèi)部實(shí)現(xiàn)配置文件的加載和讀取。

  

有如下配置文件:/src/config.properties:

ImportantString = OK
  

有如下預(yù)創(chuàng)建的對(duì)象所屬類:/src/A.java:

public class A {
    private String Aname;
    public void Ashout(){
        System.out.println("I am "+Aname+",hahaha !");
    }
    public String getAname() {
        return Aname;
    }
    public void setAname(String aname) {
        Aname = aname;
    }
}
  

有如下測(cè)試文件:/src/Test.java:

public class Test{
    public static void main(String[] args) {
        A a = AFactory.getA();
        a.Ashout();
    }
}

則可以構(gòu)造工廠類來(lái)生產(chǎn)該類的對(duì)象,生產(chǎn)過(guò)程中加載讀取配置文件并將配置文件中的重要字段賦值給創(chuàng)建出的對(duì)象,并返回這個(gè)創(chuàng)建出的對(duì)象。

  

如下工廠類文件:/src/AFactory.java:

public class AFactory {
    private static Properties properties = null;
    private static String ANameToGet;
    private AFactory() {

    }
    static{
        try {
            properties = new Properties();
            properties.load(new FileReader(AFactory.class.getClassLoader().getResource("config.properties").getPath()));
            ANameToGet = properties.getProperty("ImportantString");
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
    public static A getA(){
        A a = new A();
        a.setAname(ANameToGet);
        return a;
    }
}

我們可以發(fā)現(xiàn),通過(guò)工廠類的包裝,在調(diào)用工廠類方法構(gòu)造對(duì)象時(shí)可以十分輕松地完成任務(wù),而后面的其他任務(wù)則交由工廠類的靜態(tài)代碼塊完成。

  

那么什么是萬(wàn)能工廠類呢?萬(wàn)能當(dāng)然不是指能完成一切的工廠,而是說(shuō)在很多情況下,我們可能需要構(gòu)造各種類的對(duì)象,而這些對(duì)象在構(gòu)造過(guò)程中可能也會(huì)完成很多跟構(gòu)造相分離的相對(duì)復(fù)雜的任務(wù),這些任務(wù)可能會(huì)導(dǎo)致前臺(tái)代碼冗余,而恰恰我們要構(gòu)造的這些對(duì)象雖然分屬不同的類卻有結(jié)構(gòu)相同的代碼,這是我們不妨使用泛型來(lái)進(jìn)一步解決這個(gè)問(wèn)題。

以上面的例子為基礎(chǔ),我們需要兩個(gè)類,在這兩個(gè)類的對(duì)象的創(chuàng)建過(guò)程中都必須要檢查配置文件中的一對(duì)Key是否相等,相等的Key才能允許對(duì)象的創(chuàng)建,
否則不允許創(chuàng)建,這個(gè)過(guò)程中如果在new之前直接做判斷邏輯,將會(huì)導(dǎo)致大量的代碼冗余,因?yàn)槊總€(gè)類的對(duì)象創(chuàng)建前都要進(jìn)行相同的判斷。因此我們考慮
把這部分代碼寫(xiě)入工廠類,再生產(chǎn)過(guò)程前進(jìn)行判斷,過(guò)程封裝進(jìn)工廠類。
但是由于我們兩個(gè)類的對(duì)象的生成實(shí)現(xiàn)過(guò)程類似,因此不需要分別寫(xiě)工廠,而是統(tǒng)一地寫(xiě)一個(gè)泛型化的工廠,依據(jù)傳進(jìn)的類的類型利用Class.forName(className).newInstance()來(lái)創(chuàng)建新的對(duì)象。

  

有如下配置文件:/src/config.properties:

Key1 = RightKey
Key2 = RightKey
  

有如下預(yù)創(chuàng)建的對(duì)象所屬類:/src/A.java:

public class A {
}
  

/src/B.java:

public class B {
}
  

有如下測(cè)試文件:/src/Test.java:

public class Test{
    public static void main(String[] args) {
        A a = CommonFactory.getInstance();
        B b = CommonFactory.getInstance();
    }
}

則可以構(gòu)造工廠類來(lái)生產(chǎn)該類的對(duì)象,生產(chǎn)過(guò)程中加載讀取配置文件并將判斷配置文件中的Key以確定對(duì)象是否能正常生成,如果可以返回這個(gè)創(chuàng)建出的對(duì)象。

  

如下工廠類文件:/src/CommonFactory.java:

public class CommonFactory {
    private static Properties properties = null;
    private static String Key1;
    private static String Key2;
    static boolean no;
    private CommonFactory() {
    }
    static{
        try {
            properties = new Properties();
            properties.load(new FileReader(CommonFactory.class.getClassLoader().getResource("config.properties").getPath()));
            Key1 = properties.getProperty("Key1");
            Key2 = properties.getProperty("Key2");
            no = Key1.equals(Key2);
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
    public static  T getInstance(Class clazz){
        try {
            String className = clazz.getName();
            if(no){
                T t = (T) Class.forName(className).newInstance();
                System.out.println(className+" Object Astablished Successfully");
                return t;
            }
            else
            {
                System.out.println(className+" Object Astablished failed");
                return null;
            }


        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }

    }
}

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/64321.html

相關(guān)文章

  • php設(shè)計(jì)模式

    摘要:我們今天也來(lái)做一個(gè)萬(wàn)能遙控器設(shè)計(jì)模式適配器模式將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。今天要介紹的仍然是創(chuàng)建型設(shè)計(jì)模式的一種建造者模式。設(shè)計(jì)模式的理論知識(shí)固然重要,但 計(jì)算機(jī)程序的思維邏輯 (54) - 剖析 Collections - 設(shè)計(jì)模式 上節(jié)我們提到,類 Collections 中大概有兩類功能,第一類是對(duì)容器接口對(duì)象進(jìn)行操作,第二類是返回一個(gè)容器接口對(duì)象,上節(jié)我們介紹了...

    Dionysus_go 評(píng)論0 收藏0
  • php設(shè)計(jì)模式

    摘要:我們今天也來(lái)做一個(gè)萬(wàn)能遙控器設(shè)計(jì)模式適配器模式將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。今天要介紹的仍然是創(chuàng)建型設(shè)計(jì)模式的一種建造者模式。設(shè)計(jì)模式的理論知識(shí)固然重要,但 計(jì)算機(jī)程序的思維邏輯 (54) - 剖析 Collections - 設(shè)計(jì)模式 上節(jié)我們提到,類 Collections 中大概有兩類功能,第一類是對(duì)容器接口對(duì)象進(jìn)行操作,第二類是返回一個(gè)容器接口對(duì)象,上節(jié)我們介紹了...

    vspiders 評(píng)論0 收藏0
  • JavaScript工廠模式

    摘要:基于工廠角色和產(chǎn)品角色的多態(tài)性設(shè)計(jì)是工廠方法模式的關(guān)鍵。工廠方法模式之所以又被稱為多態(tài)工廠模式,是因?yàn)樗械木唧w工廠類都具有同一抽象父類。工廠方法模式總結(jié)工廠方法模式是簡(jiǎn)單工廠模式的進(jìn)一步抽象和推廣。 JavaScript工廠模式 首先需要說(shuō)一下工廠模式。工廠模式根據(jù)抽象程度的不同分為三種 簡(jiǎn)單工廠模式 工廠方法模式 抽象工廠模式 1.簡(jiǎn)單工廠模式 簡(jiǎn)單工廠模式:又稱為靜態(tài)工廠方法...

    oujie 評(píng)論0 收藏0
  • PHP高級(jí)特性-反射Reflection以及Factory工廠設(shè)計(jì)模式的結(jié)合使用[代碼實(shí)例]

    摘要:反射提供給面向?qū)ο缶幊炭梢宰允〉哪芰?,即反射。在?jiǎn)單工廠模式中,根據(jù)傳遞的參數(shù)來(lái)返回不同的類的實(shí)例簡(jiǎn)單工廠模式又稱為靜態(tài)工廠方法模式。也就是簡(jiǎn)單工廠模式工廠工廠類。PHP高級(jí)特性-反射以及工廠設(shè)計(jì)模式的結(jié)合使用 [結(jié)合 Laravel-Admin 代碼實(shí)例講解]利用反射來(lái)實(shí)現(xiàn)工廠模式的生產(chǎn)而無(wú)需創(chuàng)建特定的工廠類本文地址http://janrs.com/?p=833轉(zhuǎn)載無(wú)需經(jīng)過(guò)作者本人授權(quán)轉(zhuǎn)載...

    番茄西紅柿 評(píng)論0 收藏2637
  • 設(shè)計(jì)模式學(xué)習(xí)筆記:工廠模式

    摘要:二簡(jiǎn)單工廠模式組成工廠類工廠模式的核心,通過(guò)調(diào)用它來(lái)實(shí)現(xiàn)其他類的功能。三工廠方法模式利用工廠方法模式可以有效解決簡(jiǎn)單工廠模式破壞開(kāi)閉原則的問(wèn)題。 一、概念 1、工廠模式分為三類:(1)簡(jiǎn)單工廠模式:一個(gè)工廠創(chuàng)建所有產(chǎn)品(2)工廠方法模式:一個(gè)工廠方法創(chuàng)建一個(gè)產(chǎn)品(3)抽象工廠模式:一個(gè)工廠方法創(chuàng)建一類產(chǎn)品 2、創(chuàng)建型模式這種模式是指將實(shí)例的創(chuàng)建和使用分離開(kāi)來(lái),隱藏類實(shí)例的創(chuàng)建細(xì)節(jié),外界...

    luxixing 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<