国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

工廠模式和“萬能”工廠類

LancerComet / 871人閱讀

摘要:如下工廠類文件我們可以發現,通過工廠類的包裝,在調用工廠類方法構造對象時可以十分輕松地完成任務,而后面的其他任務則交由工廠類的靜態代碼塊完成。因此我們考慮把這部分代碼寫入工廠類,再生產過程前進行判斷,過程封裝進工廠類。

  

需要構造一個類的對象,我們通常會用new的方法來構造:

A a = new A();
  

但是如果隨著這個對象被創建的同時還必須進行其他相對復雜的操作,那么在新建構造一個對象代碼就顯得非常復雜,這個復雜的代碼通常還需要每一次都復寫,大大增加了冗余。

因此我們構造了生產這個類對應對象的工廠,用工廠的方法來生產對象。
比如:我們需要在構造一個對象時并不知道這個對象中的某個字段的確切值,該值保存在配置文件中,所以每次構造對象都要進行配置文件的讀取,依據配置文件中的內容來確定這個對象中該字段的信息,這個過程如果直接使用new來實現將會造成大量代碼的冗余,大量冗余存在于配置文件的加載和讀取,不妨把它封裝成工廠類,在工廠類內部實現配置文件的加載和讀取。

  

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

ImportantString = OK
  

有如下預創建的對象所屬類:/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;
    }
}
  

有如下測試文件:/src/Test.java:

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

則可以構造工廠類來生產該類的對象,生產過程中加載讀取配置文件并將配置文件中的重要字段賦值給創建出的對象,并返回這個創建出的對象。

  

如下工廠類文件:/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;
    }
}

我們可以發現,通過工廠類的包裝,在調用工廠類方法構造對象時可以十分輕松地完成任務,而后面的其他任務則交由工廠類的靜態代碼塊完成。

  

那么什么是萬能工廠類呢?萬能當然不是指能完成一切的工廠,而是說在很多情況下,我們可能需要構造各種類的對象,而這些對象在構造過程中可能也會完成很多跟構造相分離的相對復雜的任務,這些任務可能會導致前臺代碼冗余,而恰恰我們要構造的這些對象雖然分屬不同的類卻有結構相同的代碼,這是我們不妨使用泛型來進一步解決這個問題。

以上面的例子為基礎,我們需要兩個類,在這兩個類的對象的創建過程中都必須要檢查配置文件中的一對Key是否相等,相等的Key才能允許對象的創建,
否則不允許創建,這個過程中如果在new之前直接做判斷邏輯,將會導致大量的代碼冗余,因為每個類的對象創建前都要進行相同的判斷。因此我們考慮
把這部分代碼寫入工廠類,再生產過程前進行判斷,過程封裝進工廠類。
但是由于我們兩個類的對象的生成實現過程類似,因此不需要分別寫工廠,而是統一地寫一個泛型化的工廠,依據傳進的類的類型利用Class.forName(className).newInstance()來創建新的對象。

  

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

Key1 = RightKey
Key2 = RightKey
  

有如下預創建的對象所屬類:/src/A.java:

public class A {
}
  

/src/B.java:

public class B {
}
  

有如下測試文件:/src/Test.java:

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

則可以構造工廠類來生產該類的對象,生產過程中加載讀取配置文件并將判斷配置文件中的Key以確定對象是否能正常生成,如果可以返回這個創建出的對象。

  

如下工廠類文件:/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);
        }

    }
}

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64321.html

相關文章

  • php設計模式

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

    Dionysus_go 評論0 收藏0
  • php設計模式

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

    vspiders 評論0 收藏0
  • JavaScript工廠模式

    摘要:基于工廠角色和產品角色的多態性設計是工廠方法模式的關鍵。工廠方法模式之所以又被稱為多態工廠模式,是因為所有的具體工廠類都具有同一抽象父類。工廠方法模式總結工廠方法模式是簡單工廠模式的進一步抽象和推廣。 JavaScript工廠模式 首先需要說一下工廠模式。工廠模式根據抽象程度的不同分為三種 簡單工廠模式 工廠方法模式 抽象工廠模式 1.簡單工廠模式 簡單工廠模式:又稱為靜態工廠方法...

    oujie 評論0 收藏0
  • PHP高級特性-反射Reflection以及Factory工廠設計模式的結合使用[代碼實例]

    摘要:反射提供給面向對象編程可以自省的能力,即反射。在簡單工廠模式中,根據傳遞的參數來返回不同的類的實例簡單工廠模式又稱為靜態工廠方法模式。也就是簡單工廠模式工廠工廠類。PHP高級特性-反射以及工廠設計模式的結合使用 [結合 Laravel-Admin 代碼實例講解]利用反射來實現工廠模式的生產而無需創建特定的工廠類本文地址http://janrs.com/?p=833轉載無需經過作者本人授權轉載...

    番茄西紅柿 評論0 收藏2637
  • 設計模式學習筆記:工廠模式

    摘要:二簡單工廠模式組成工廠類工廠模式的核心,通過調用它來實現其他類的功能。三工廠方法模式利用工廠方法模式可以有效解決簡單工廠模式破壞開閉原則的問題。 一、概念 1、工廠模式分為三類:(1)簡單工廠模式:一個工廠創建所有產品(2)工廠方法模式:一個工廠方法創建一個產品(3)抽象工廠模式:一個工廠方法創建一類產品 2、創建型模式這種模式是指將實例的創建和使用分離開來,隱藏類實例的創建細節,外界...

    luxixing 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<