(CZ深刻淺出Java基礎)設計模式筆記

這是劉意老師的JAVA基礎教程的筆記
講的賊好,附上傳送門編程

傳智風清揚-超全面的Java基礎設計模式

1、面向對象思想設計原則

1.單一職責原則

其實就是開發人員常常說的」高內聚,低耦合」,也就是說,每一個類應該只有一個職責,對外只能提供一種功能,而引發類變化的緣由應該只有一個。在設計模式中,全部的設計模式都遵循這一原則。安全

2.開閉原則

核心思想是:一個對象對擴展開放,對修改關閉。
其實開閉原則的意思就是:對類的改動是經過增長代碼進行的,而不是修改現有代碼。
也就是說軟件開發人員一旦寫出了能夠運行的代碼,就不該該去改動它,而是要保證它能一直運行下去,如何可以作到這一點呢?這就須要藉助於抽象和多態,即把可能變化的內容抽象出來,從而使抽象的部分是相對穩定的,而具體的實現則是能夠改變和擴展的。ide

3.里氏替換原則

核心思想:在任何父類出現的地方均可以用它的子類來替代。
其實就是說:同一個繼承體系中的對象應該有共同的行爲特徵。性能

4.依賴注入原則

核心思想:要依賴於抽象,不要依賴於具體實現。
其實就是說:在應用程序中,全部的類若是使用或依賴於其餘的類,則應該依賴這些其餘類的抽象類,而不是這些其餘類的具體類。爲了實現這一原則,就要求咱們在編程的時候針對抽象類或者接口編程,而不是針對具體實現編程。學習

5.接口分離原則

核心思想:不該該強迫程序依賴它們不須要使用的方法。
其實就是說:一個接口不須要提供太多的行爲,一個接口應該只提供一種對外的功能,不該該把全部的操做都封裝到一個接口中。線程

6.迪米特原則
核心思想:一個對象應當對其餘對象儘量少的瞭解
其實就是說:下降各個對象之間的耦合,提升系統的可維護性。在模塊之間應該只經過接口編程,而不理會模塊的內部工做原理,它可使各個模塊耦合度降到最低,促進軟件的複用設計

2、設計模式

1.概述

1.1.概念
設計模式(Design pattern)是一套被反覆使用、多數人知曉的、通過分類編目的、代碼設計經驗的總結。使用設計模式是爲了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。
設計模式不是一種方法和技術,而是一種思想
設計模式和具體的語言無關,學習設計模式就是要創建面向對象的思想,儘量的面向接口編程,低耦合,高內聚,使設計的程序可複用
學習設計模式可以促進對面向對象思想的理解,反之亦然。它們相輔相成代理

1.2.要素
名字 必須有一個簡單,有意義的名字
問題 描述在什麼時候使用模式
解決方案 描述設計的組成部分以及如何解決問題
效果 描述模式的效果以及優缺點code

1.3.分類
建立型模式 對象的建立:簡單工廠模式,工廠方法模式,抽象工廠模式,建造者模式,原型模式,單例模式。(6個)

結構型模式 對象的組成(結構):外觀模式、適配器模式、代理模式、裝飾模式、橋接模式、組合模式、享元模式。(7個)

行爲型模式 對象的行爲:模版方法模式、觀察者模式、狀態模式、職責鏈模式、命令模式、訪問者模式、策略模式、備忘錄模式、迭代器模式、解釋器模式。(10個)

2.建立型模式具體使用

2.1.簡單工廠模式
又叫靜態工廠方法模式,它定義一個具體的工廠類負責建立一些類的實例
優勢
客戶端不須要在負責對象的建立,從而明確了各個類的職責
缺點
這個靜態工廠類負責全部對象的建立,若是有新的對象增長,或者某些對象的建立方式不一樣,就須要不斷的修改工廠類,不利於後期的維護

public class Demo {
    public static void main(String[] args) {

    }

}

class AnimalFactory {
    private AnimalFactory() {
    }

    static Animal creatAnimal(String type) {
        if ("dog".equals(type)) {
            return new Dog();
        }
        if ("cat".equals(type))
            return new Cat();
        return null;
    }
}

abstract class Animal {
    abstract void eat();
}

class Dog extends Animal {
    @Override
    void eat() {
        System.out.println("dog eats meat");
    }
}

class Cat extends Animal {
    @Override
    void eat() {
        System.out.println("cat eats fish");
    }
}

2.2.工廠方法模式
工廠方法模式中抽象工廠類負責定義建立對象的接口,具體對象的建立工做由繼承抽象工廠的具體類實現。
優勢
客戶端不須要在負責對象的建立,從而明確了各個類的職責,若是有新的對象增長,只須要增長一個具體的類和具體的工廠類便可,不影響已有的代碼,後期維護容易,加強了系統的擴展性
缺點
須要額外的編寫代碼,增長了工做量

public class Demo {
    public static void main(String[] args) {
        Factory df=new DogFactory();
        Animal a=df.creatAnimal();
        a.eat();
        Factory cf=new CatFactory();
        Animal b=cf.creatAnimal();
        b.eat();
    }

}

interface Factory{
    Animal creatAnimal();
}

class DogFactory implements Factory{
    @Override
    public Animal creatAnimal() {
        return new Dog();
    }
    
}

class CatFactory implements Factory{
    @Override
    public Animal creatAnimal() {
        return new Cat();
    }
    
}

abstract class Animal {
    abstract void eat();
}

class Dog extends Animal {
    @Override
    void eat() {
        System.out.println("dog eats meat");
    }
}

class Cat extends Animal {
    @Override
    void eat() {
        System.out.println("cat eats fish");
    }
}

2.3.單例設計模式概述
單例模式就是要確保類在內存中只有一個對象,該實例必須自動建立,而且對外提供。優勢
在系統內存中只存在一個對象,所以能夠節約系統資源,對於一些須要頻繁建立和銷燬的對象單例模式無疑能夠提升系統的性能。
缺點
沒有抽象層,所以擴展很難。
職責太重,在必定程序上違背了單一職責

  • 飢餓型
    在類加載的時候就已經建立好對象
public class Demo {
    public static void main(String[] args) {
        Student s1=Student.getStudent();
        Student s2=Student.getStudent();
        System.out.println(s1==s2);
    }

}

class Student {
    private Student() {//讓外界不能建立這個類的對象

    }

    private static Student s = new Student();//爲了避免讓外界直接訪問修改這個值,因此要加private

    static Student getStudent() {
        return s;
    }
}
  • 懶惰式
    用的時候纔去建立對象
    可能產生線程安全問題
public class Demo {
    public static void main(String[] args) {
        Teacher t1=Teacher.getTeacher();
        Teacher t2=Teacher.getTeacher();
        System.out.println(t1==t2);
        
    }

}

class Teacher {
    private Teacher() {
    }

    private static Teacher t = null;

    static Teacher getTeacher() {
        if (t == null)
            t = new Teacher();
        return t;
    }
}

單例模式的應用---Runtime類

public class Demo {
    public static void main(String[] args) {
        Runtime run=Runtime.getRuntime();
        try {
            run.exec("calc");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
相關文章
相關標籤/搜索