面向對象核心思想和單例模式

引言

面試中經常會問到面向對象的思想,比如封裝、繼承、多態什麼的,如果基礎好的話,還問順便問下設計模式,問的最多的有單例模式。看了《大話設計模式》和《Java編程思想》的相關內容後,對此做一個讀書筆記。

面向對象核心思想

面向對象的核心思想,基本上都可以說出來,封裝、繼承、多態

方法重寫和多態

記得我之前回答面試問題,什麼是多態?總答的是某個類中的一個方法由不同的參數數量和類型的改變,從而實現了不同的功能,這就是多態的體現。
其實我這個回答,答對了一半。但是又混淆了方法重載方法重寫。我實際回答的是方法重寫,而多態是要和繼承關係扯上聯繫的。
簡短來說,就是子類重載了父類的非private (包含public和protected)方法,在實例化父類時可以用子類實例化,發生了向上轉型,同時子類用自己的內容實現了父類的對應方法。
這麼說對於不懂多態的人有點繞,下面引用下《大話設計模式》的三個要點。

第一,子類以父類的身份出現
第二,子類在工作時以自己的方式實現
第三,子類以父類的身份出現時,子類特有的屬性和方法不可以使用。

子類喬裝成父類,對外無法看出是子類還是父類

單例模式

單例模式的定義爲單例對象的類必須保證只有一個實例存在
那麼爲什麼要這樣呢?

比如在某個服務器程序中,該服務器的配置信息存放在一個文件中,這些配置數據由一個單例對象統一讀取,然後服務進程中的其他對象再通過這個單例對象獲取這些配置信息。這種方式簡化了在複雜環境下的配置管理

OOP編程中的各種訪問限定符,繼承、多態的關係的各種精妙的組合,構成了不同的設計模式,來滿足我們的設計需求。
最簡單的實現單例模式的思路是,讓這個類的構造函數爲私有的,並且實現一個靜態方法對外返回其唯一實例。

public class Singleton {
    private static Singleton singleton = null;
    private Singleton() {  }
    public static Singleton getInstance() {
        if (singleton== null) {
            singleton= new Singleton();
        }
        return singleton;
    }
}

1.私有(private)的構造函數,表明這個類是不可能形成實例了。這主要是怕這個類會有多個實例。
2.即然這個類是不可能形成實例,那麼,我們需要一個靜態的方式讓其形成實例:getInstance()。注意這個方法是在new自己,因爲其可以訪問私有的構造函數,所以他是可以保證實例被創建出來的。
3.在getInstance()中,先做判斷是否已形成實例,如果已形成則直接返回,否則創建實例。 4 .所形成的實例保存在自己類中的私有成員中。 我們取實例時,只需要使用Singleton.getInstance()就行了。

實際應用

在實際應用中,由於多線程的問題,會對簡單實現的單例模式有所改寫,這就讓讀者自己去探索。

參考:

《大話設計模式》
《Java編程思想》
https://en.wikipedia.org/wiki/Singleton_pattern
http://coolshell.cn/articles/265.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章