java面向對象與設計模式(一)


設計原則:SOLID 可以說,五個設計原則各司其職。
單一職責原則(S):用於類的設計
開閉原則(O):總的指導思想
里氏替換原則(L):用於指導類繼承的設計
接口隔離原則(I):用於指導接口的設計
依賴翻轉原則(D):用於指導如何抽象

類之間的關系
繼承=實現>組合>聚合>關聯>依賴

UML表現
繼承:帶三角箭頭的實線,箭頭指向父類
實現:帶三角箭頭的虛線,箭頭指向接口
組合:帶實心菱形的實線,菱形指向整體
聚合:帶空心菱形的實線,菱形指向整體
關聯:帶普通箭頭的實線,指向被擁有者
依賴:帶普通箭頭的虛線,指向被使用者
簡 單說明一下,《1》繼承和實現是java自帶的,屬於強耦合關系;《2》組合和聚合是特殊的關聯關系,關聯關系體現在代碼上就是作為成員變量,聚合關系要 強於關聯關系,代碼上往往會通過set()方法完成對成員變量的賦值,組合關系則更加強一些,往往在構造函數就完成了初始化,也就是說,在一般情況下,生 命周期上組合>聚合>關聯;《3》依賴和關聯恰恰相反,代碼上一般不出現在成員變量。常見於局部變量、方法的參數或者對靜態方法的調用。
 
設計模式:(經典23式)
設計模式的核心在於復用,如果單用,則成為累贅。

第零式 簡單工廠模式。
預備知識:接口
接口能夠隔離封裝,為系統的可插拔性提供保證。在接口也抽象類的選擇上,應該優先選擇接口,只有需要為子類提供公共功能的時候,才需要考慮抽象類。
下面舉個例子,說明接口的具體實現。
public interface product {
    
    public void createProduct();

}


public class conCreteProduct implements product {

    @Override
    public void createProduct() {
        // TODO Auto-generated method stub
        System.out.println("生產產品");
    }

}


public class user {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        product prod1 = new conCreteProduct();
        prod1.createProduct();
    }

}
上面這個例子雖然使用了接口隔離(並沒有完全隔離),但是還是存在一些問題。那就是user需要知道具體實現。這樣user和具體產品就存在着耦合關系。而增加一個工廠類則可以達到解除耦合的目的。
public interface product {
    
    public void createProduct();

}


public class conCreteProduct implements product {

    @Override
    public void createProduct() {
        // TODO Auto-generated method stub
        System.out.println("生產產品");
    }

}


public class factory {
    
    public void createProduct() {
        product prod1 = new conCreteProduct();
        prod1.createProduct();
    }

}


public class user {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        factory fact1 = new factory();
        fact1.createProduct();
    }

}
增加了factory類以后,user就可以不需要關注具體實現了。把生產商品的事情交給了工廠來處理。而自己則專注於消費產品就可以了。這對於一個產品來說,的確是得不償失的。但如果產品的種類多的話,優勢還是很明顯的(user不需要考慮繁瑣的創建過程)。
 
簡單工廠模式的定義:提供一個 創建對象實例的功能,而無須關心其具體實現。被創建對象的類型,可以是接口,抽象類,也可以是具體的類。
 
簡單工廠的本質是選擇實現。優點在於幫助封裝和解耦,缺點則在於增加了客戶端復雜度以及不利於擴展子工廠。
 
簡單工廠常采用靜態方法來實現,所以有時被稱作靜態工廠。為了選擇實現,還可以把選擇的部分配置到配置文件當中去。
public interface product {
    
    public void makeProduct();

}


public class concreteProduct implements product {

    @Override
    public void makeProduct() {
        // TODO Auto-generated method stub
        System.out.println("中國制造");
    }

}



public class factory {
    
    public static product makeProduct() {

        Properties pro = new Properties();
        InputStream in = null;
        try {
            in = factory.class.getResourceAsStream("factory.properties");
            pro.load(in);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            try {
                in.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        
        product prod = null;
        try {
            prod = (product) Class.forName(pro.getProperty("product1")).newInstance();
        } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        return prod;
        
    }
    
}


public class user {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        product prod = factory.makeProduct();
        prod.makeProduct();
    }

}


配置文件factory.properties

product1=No0.concreteProduct


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM