設(shè)計(jì)模式(三)—— 讓我們一起來扒光“單例模式”

前言

時(shí)隔一月之久,設(shè)計(jì)模式第三篇終于來了妆绞。(好吧顺呕,主要還是我自己拖沓了枫攀,下次注意)

通過前兩篇文章,相信大家已經(jīng)對(duì)設(shè)計(jì)模式有了大概的了解株茶。那么今天我們就正式進(jìn)入模式的學(xué)習(xí)来涨。首先肯定要先拿軟柿子捏,單例模式——最簡(jiǎn)單的設(shè)計(jì)模式启盛。

身為程序員蹦掐,你可能沒有系統(tǒng)的學(xué)習(xí)過設(shè)計(jì)模式,但是你一定知道單例模式僵闯,因?yàn)樗鄬?duì)簡(jiǎn)單,而且最常被大家所用到。既然大家都用到過蠢络,也都知道為什么我還要單獨(dú)列出一篇文章來寫呢弹砚?
?
因?yàn)榻^大部分開發(fā)者平時(shí)對(duì)單例模式的認(rèn)識(shí),可能僅僅停留在“會(huì)用”的階段向图。為什么會(huì)有這個(gè)模式泳秀?為什么要用這個(gè)模式?在哪里用單例模式最合適张漂?亂用了會(huì)有什么負(fù)面影響晶默?
?
這些可能大多數(shù)人都一知半解。今天就讓我們大家一起來扒光單例模式的外衣航攒,有深度的認(rèn)識(shí)一下單例模式磺陡。

扒光

通過這篇文章你能學(xué)到什么

(建議你可以帶著問題去學(xué)習(xí))

  1. 單例模式的?定義
  2. 單例模式在Android源碼中的應(yīng)用
  3. 單例模式的九種寫法以及優(yōu)劣對(duì)比
  4. 單例模式的使用場(chǎng)景
  5. 單例模式存在的缺點(diǎn)??????

接下來我們就一起進(jìn)入今天的學(xué)習(xí)了

單例模式的定義

在學(xué)單例模式之前,我想大家都會(huì)自己?jiǎn)栕约海?strong>“單例模式存在的意義是什么漠畜?我們?yōu)槭裁匆脝卫J奖宜俊?/strong>

眾所周知,在古代封建社會(huì)憔狞,一個(gè)國(guó)家都只有一個(gè)國(guó)王或者叫皇帝蝴悉。我們?cè)谶@個(gè)國(guó)家的任何一個(gè)地方,只要提起國(guó)王瘾敢,大家都知道他是誰拍冠。因?yàn)閲?guó)王是唯一的。其實(shí)這個(gè)就是單例模式的核心思想:保證對(duì)象的唯一性簇抵。

?單例模式(Singleton Pattern):確保某一個(gè)類只有一個(gè)實(shí)例庆杜,而且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例,這個(gè)類稱為單例類碟摆,它提供全局訪問的方法晃财。 單例模式是一種對(duì)象創(chuàng)建型模式。

??從其定義我們可以看出來單例模式存在三個(gè)要點(diǎn):

1典蜕、實(shí)例唯一性
2断盛、自行創(chuàng)建
3罗洗、全局訪問

????如何設(shè)計(jì)一個(gè)優(yōu)秀的單例模式?其實(shí)也是圍繞著這三點(diǎn)來的。
?
說了這么多了钢猛,還不知道單例模式到底啥樣呢伙菜?接下來我們一起來著手設(shè)計(jì)這個(gè)“國(guó)王”的單例類。我們先看一下單例模式的類圖:

?
單例模式類圖

單例模式的類圖看起來很簡(jiǎn)單厢洞,一個(gè)私有的當(dāng)前類型的成員變量仇让,一個(gè)私有的構(gòu)造方法,一個(gè) getInstance 方法躺翻,創(chuàng)建對(duì)象不再通過new 而通過 getInstance 讓該類自行創(chuàng)建丧叽。相信我們大多數(shù)人使用的單例模式都是這種,因?yàn)樘?jiǎn)單了公你。但是單例模式的寫法可不止這一種踊淳。接下來我們一起來看一下單例模式的九種寫法。

單例模式的九種寫法

一陕靠、餓漢式(靜態(tài)常量)
 /**
 * 餓漢式(靜態(tài)常量)
 */
class King {
    private static final King kingInstance = new King();

    static King getInstance() {
        return kingInstance;
    }

    private King() {
    }
} 
  • 優(yōu)點(diǎn):這種寫法比較簡(jiǎn)單迂尝,就是在類裝載的時(shí)候就完成實(shí)例化。避免了線程同步問題剪芥。
  • 缺點(diǎn):在類裝載的時(shí)候就完成實(shí)例化垄开,沒有達(dá)到Lazy Loading的效果。如果從始至終從未使用過這個(gè)實(shí)例税肪,則會(huì)造成內(nèi)存的浪費(fèi)溉躲。
二、餓漢式(靜態(tài)代碼塊)
/**
 * 餓漢式(靜態(tài)代碼塊)
 */
class King {
    private static King kingInstance;

    static {
        kingInstance = new King();
    }

    private King() {
    }

    public static King getKingInstance() {
        return kingInstance;
    }
} 
  • 優(yōu)點(diǎn):這種寫法比較簡(jiǎn)單益兄,就是在類裝載的時(shí)候就完成實(shí)例化锻梳。避免了線程同步問題。
  • 缺點(diǎn):在類裝載的時(shí)候就完成實(shí)例化净捅,沒有達(dá)到Lazy Loading的效果疑枯。如果從始至終從未使用過這個(gè)實(shí)例,則會(huì)造成內(nèi)存的浪費(fèi)蛔六。
三荆永、懶漢式(線程不安全)
/**
 * 懶漢式(線程不安全)
 */
public class King {
    private static King kingInstance;

    private King() {
    }

    public static King getKingInstance() {
        if (kingInstance == null) {
            kingInstance = new King();
        }
        return kingInstance;
    }
}
  • 優(yōu)點(diǎn):懶加載,只有使用的時(shí)候才會(huì)加載国章。
  • 缺點(diǎn):但是只能在單線程下使用屁魏。如果在多線程下,一個(gè)線程進(jìn)入了if (singleton == null)判斷語句塊捉腥,還未來得及往下執(zhí)行,另一個(gè)線程也通過了這個(gè)判斷語句你画,這時(shí)便會(huì)產(chǎn)生多個(gè)實(shí)例抵碟。所以在多線程環(huán)境下不可使用這種方式桃漾。
四、懶漢式(線程安全)
/**
 * 懶漢式(線程安全拟逮,同步方法)
 */
public class King {
    private static King kingInstance;

    private King() {
    }

    public static synchronized King getKingInstance() {
        if (kingInstance == null) {
            kingInstance = new King();
        }
        return kingInstance;
    }
}
  • 優(yōu)點(diǎn):懶加載撬统,只有使用的時(shí)候才會(huì)加載,獲取單例方法加了同步鎖敦迄,保障線程安全恋追。
  • 缺點(diǎn):效率太低了,每個(gè)線程在想獲得類的實(shí)例時(shí)候罚屋,執(zhí)行g(shù)etInstance()方法都要進(jìn)行同步苦囱。
五、懶漢式(線程安全脾猛,同步代碼塊)
/**
 * 懶漢式(線程安全撕彤,同步代碼塊)
 */
public class King {
    private static King kingInstance;

    private King() {
    }

    public static King getKingInstance() {
        if (kingInstance == null) {
            synchronized (King.class) {
                kingInstance = new King();
            }
        }
        return kingInstance;
    }
}
  • 優(yōu)點(diǎn):改進(jìn)了第四種效率低的問題。
  • 缺點(diǎn):不能完全保證單例猛拴,假如一個(gè)線程進(jìn)入了if (singleton == null)判斷語句塊羹铅,還未來得及往下執(zhí)行,另一個(gè)線程也通過了這個(gè)判斷語句愉昆,這時(shí)便會(huì)產(chǎn)生多個(gè)實(shí)例职员。
六、雙重檢查(DCL)
/**
 * 雙重檢查(DCL)
 */
public class King {

    private static volatile King kingInstance;

    private King() {
    }

    public static King getKingInstance() {
        if (kingInstance == null) {
            synchronized (King.class) {
                if (kingInstance == null){
                    kingInstance = new King();
                }
            }
        }
        return kingInstance;
    }
}
  • 優(yōu)點(diǎn):線程安全跛溉;延遲加載焊切;效率較高。
  • 缺點(diǎn):JDK < 1.5 的時(shí)候不可用
  • 不可用原因:由于volatile關(guān)鍵字會(huì)屏蔽Java虛擬機(jī)所做的一些代碼優(yōu)化倒谷,可能會(huì)導(dǎo)致系統(tǒng)運(yùn)行效率降低蛛蒙,而JDK 1.5 以及之后的版本都修復(fù)了這個(gè)問題。(面試裝逼用渤愁,謹(jǐn)記GK睢!6陡瘛)
就是為了裝逼
七诺苹、靜態(tài)內(nèi)部類
/**
 * 靜態(tài)內(nèi)部類
 */
public class King {

    private King() {
    }

    private static class KingInstance{
        private static final King KINGINSTANCE = new King();
    }

    public static King getInstance(){
        return KingInstance.KINGINSTANCE;
    }
}
  • 優(yōu)點(diǎn):避免了線程不安全,延遲加載雹拄,效率高收奔。
  • 缺點(diǎn):暫無,最推薦使用滓玖。
  • 特點(diǎn):這種方式跟餓漢式方式采用的機(jī)制類似坪哄,但又有不同。
  • 兩者都是采用了類裝載的機(jī)制來保證初始化實(shí)例時(shí)只有一個(gè)線程。不同的地方在餓漢式方式是只要Singleton類被裝載就會(huì)實(shí)例化翩肌,沒有Lazy-Loading的作用模暗,而靜態(tài)內(nèi)部類方式在Singleton類被裝載時(shí)并不會(huì)立即實(shí)例化,而是在需要實(shí)例化時(shí)念祭,調(diào)用getInstance方法兑宇,才會(huì)裝載SingletonInstance類,從而完成Singleton的實(shí)例化粱坤。 類的靜態(tài)屬性只會(huì)在第一次加載類的時(shí)候初始化隶糕,所以在這里,JVM幫助我們保證了線程的安全性站玄,在類進(jìn)行初始化時(shí)枚驻,別的線程是無法進(jìn)入的。
八蜒什、枚舉
/**
 * 枚舉
 */
public enum  King {
    KINGINSTANCE;
}
  • 優(yōu)點(diǎn):不僅能避免多線程同步問題测秸,而且還能防止反序列化重新創(chuàng)建新的對(duì)象。
  • 缺點(diǎn):JDK 1.5之后才能使用灾常。
九霎冯、容器類管理
/**
 * 使用容器實(shí)現(xiàn)單例模式(可以用于管理單例,有興趣的可以嘗試一下)
 * */
class InstanceManager {
    private static Map<String, Object> objectMap = new HashMap<>();
    private InstanceManager(){}
    public static void registerService(String key,Object instance){
        if (!objectMap.containsKey(key)){
            objectMap.put(key,instance);
        }
    }
    public static Object getService(String key){
        return objectMap.get(key);
    }
}
/**
* 使用方式
* Dog類就不貼出來了 
* 自己隨便寫個(gè)就行
* 可以運(yùn)行一下看看 打印的地址是否一致
*/
class Test {
    public static void main(String[] args) {

        InstanceManager .registerService("dog", new Dog());

        Dog dog = (Dog) InstanceManager .getService("dog");
        Dog dog2 = (Dog) InstanceManager .getService("dog");
        Dog dog3 = (Dog) InstanceManager .getService("dog");
        Dog dog4 = (Dog) InstanceManager .getService("dog");

        System.out.println(dog);
        System.out.println(dog2);
        System.out.println(dog3);
        System.out.println(dog4);
    }
}
  • 優(yōu)點(diǎn):在程序的初始钞瀑,將多種單例類型注入到一個(gè)統(tǒng)一的管理類中沈撞,在使用時(shí)根據(jù)key獲取對(duì)象對(duì)應(yīng)類型的對(duì)象。這種方式使得我們可以管理多種類型的單例雕什,并且在使用時(shí)可以通過統(tǒng)一的接口進(jìn)行獲取操作缠俺, 降低了用戶的使用成本,也對(duì)用戶隱藏了具體實(shí)現(xiàn)贷岸,降低了耦合度壹士。
  • 缺點(diǎn):不常用,有些麻煩

九種寫法的優(yōu)劣對(duì)比

名稱 優(yōu)點(diǎn) 缺點(diǎn) 是否推薦
餓漢式(靜態(tài)常量) 寫法簡(jiǎn)單偿警,類裝載時(shí)完成實(shí)例化躏救。 避免了線程同步 急切實(shí)例化, 容易內(nèi)存泄漏 可用
餓漢式(靜態(tài)代碼塊) 同上 同上 可用
懶漢式(線程不安全) 懶加載 只能在單線程下使用 多線程不可用
懶漢式(線程安全螟蒸,同步方法) 懶加載盒使,方法同步鎖 效率低 不推薦用
懶漢式(線程安全,同步代碼塊) 同上七嫌,同時(shí)改變效率低問題 不能完全保證單例 不推薦用
雙重檢查(DCL)① 線程安全少办;延遲加載;效率較高 JDK < 1.5 的時(shí)候不可用 JDK >1.5 推薦用
靜態(tài)內(nèi)部類② 線程安全诵原,延遲加載英妓,效率高挽放。 暫無發(fā)現(xiàn) 墻裂推薦
枚舉 寫法簡(jiǎn)單,防止反序列化 JDK 1.5之后才能使用 JDK >1.5 推薦用
容器實(shí)現(xiàn) 可用管理多個(gè)單例對(duì)象 不常用鞋拟,多創(chuàng)建了一個(gè)Map 可用

①:不可用原因:由于volatile關(guān)鍵字會(huì)屏蔽Java虛擬機(jī)所做的一些代碼優(yōu)化骂维,可能會(huì)導(dǎo)致系統(tǒng)運(yùn)行效率降低,而JDK 1.5 以及之后的版本都修復(fù)了這個(gè)問題贺纲。(面試裝逼用,謹(jǐn)記M什狻:锾堋!)

②:這種方式跟餓漢式方式采用的機(jī)制類似侮措,但又有不同懈叹。兩者都是采用了類裝載的機(jī)制來保證初始化實(shí)例時(shí)只有一個(gè)線程。不同的地方在餓漢式方式是只要Singleton類被裝載就會(huì)實(shí)例化分扎,沒有Lazy-Loading的作用澄成, 而靜態(tài)內(nèi)部類方式在Singleton類被裝載時(shí)并不會(huì)立即實(shí)例化,而是在需要實(shí)例化時(shí)畏吓,調(diào)用getInstance方法墨状,才會(huì)裝載SingletonInstance類,從而完成Singleton的實(shí)例化菲饼。 類的靜態(tài)屬性只會(huì)在第一次加載類的時(shí)候初始化肾砂,所以在這里,JVM幫助我們保證了線程的安全性宏悦,在類進(jìn)行初始化時(shí)镐确,別的線程是無法進(jìn)入的。

單例模式在Android源碼中的應(yīng)用

在我們每天接觸的Android源碼中其實(shí)也有很多地方用到了單例模式:

1饼煞、EventBus中獲取實(shí)例:

private static volatile EventBus defaultInstance;
public static EventBus getDefault() {
    if (defaultInstance == null) {
        synchronized (EventBus.class) {
            if (defaultInstance == null) {
                defaultInstance = new EventBus();
            }
        }
    }
    return defaultInstance;
}

可以看到源葫,EventBus采用的是雙重檢查(DCL)的方式實(shí)現(xiàn)的單例模式。

2砖瞧、InputMethodManager獲取實(shí)例

static InputMethodManager sInstance;
public static InputMethodManager getInstance() {
    synchronized (InputMethodManager.class) {
        if (sInstance == null) {
            IBinder b = ServiceManager.getService(Context.INPUT_METHOD_SERVICE);
            IInputMethodManager service = IInputMethodManager.Stub.asInterface(b);
            sInstance = new InputMethodManager(service, Looper.getMainLooper());
        }
        return sInstance;
    }
}

我們看到息堂,其實(shí)這里是懶漢式(同步代碼塊)方式的改寫,去掉了外部判斷為空芭届,放到了里面储矩。然后通過ServiceManger.getService()方法,通過容器的方式獲取了單例褂乍。

在Android很多系統(tǒng)服務(wù)都是通過容器獲取的單例持隧。

單例模式在日常開發(fā)中的應(yīng)用場(chǎng)景

日常開發(fā)中我們也有些場(chǎng)景是需要用到單例模式的,例如:

1逃片、圖片加載
2屡拨、網(wǎng)絡(luò)請(qǐng)求
3只酥、工具類封裝

案例有很多,相信大家也都有用到呀狼,我就不列舉了裂允。這里我們?nèi)绾魏侠淼脑陧?xiàng)目中使用單例模式。

合理的辨析一個(gè)設(shè)計(jì)是否應(yīng)該為單例模式前哥艇,大家先問問自己幾個(gè)問題绝编,也是檢驗(yàn)標(biāo)準(zhǔn):

Quote from 《 Use your singletons wisely 》

Will every application use this class exactly the same way? (keyword: exactly)
Will every application ever need only one instance of this class? (keyword: ever & one)
Should the clients of this class be unaware of the application they are part of?

每一個(gè)應(yīng)用(組件/模塊)是否以完全一致的方式來使用這個(gè)類?
每一個(gè)應(yīng)用(組件/模塊)是否真的只需要這個(gè)類的一個(gè)實(shí)例呢貌踏?
對(duì)于這個(gè)類的客戶端類來說十饥,對(duì)他們自己是應(yīng)用中的一部分這件事是否應(yīng)該保持毫無察覺的狀態(tài)呢?

以上3條就是檢驗(yàn)一個(gè)類是否應(yīng)該被設(shè)計(jì)為單例模式的判斷準(zhǔn)則祖乳,

如果我們對(duì)于以上這3條均給出了“是的”的答案逗堵,那么這個(gè)類就是可以被設(shè)計(jì)為單例模式了。反之還是不要用的好眷昆。

單例模式的優(yōu)點(diǎn)

單例模式的優(yōu)點(diǎn)其實(shí)已經(jīng)在定義中提現(xiàn)了:可以減少系統(tǒng)內(nèi)存開支蜒秤,減少系統(tǒng)性能開銷,避免對(duì)資源的多重占用亚斋、同時(shí)操作作媚。

單例模式的缺點(diǎn)

任何事物都不是完美的,單例模式也是如此伞访,它也存在以下幾個(gè)缺點(diǎn):

1掂骏、違反了單一責(zé)任鏈原則,測(cè)試?yán)щy

單例類的職責(zé)過重厚掷,在一定程度上違背了“單一職責(zé)原則”弟灼。因?yàn)閱卫惣瘸洚?dāng)了工廠角色,提供了工廠方法冒黑,同時(shí)又充當(dāng)了產(chǎn)品角色田绑,包含一些業(yè)務(wù)方法,將產(chǎn)品的創(chuàng)建和產(chǎn)品的本身的功能融合到一起抡爹。

2掩驱、擴(kuò)展困難

由于單例模式中沒有抽象層,因此單例類的擴(kuò)展有很大的困難冬竟。修改功能必須修改源碼欧穴。

3、共享資源有可能不一致泵殴。

現(xiàn)在很多面向?qū)ο笳Z言(如Java涮帘、C#)的運(yùn)行環(huán)境都提供了自動(dòng)垃圾回收的技術(shù),因此笑诅,如果實(shí)例化的共享對(duì)象長(zhǎng)時(shí)間不被利用调缨,系統(tǒng)會(huì)認(rèn)為它是垃圾疮鲫,會(huì)自動(dòng)銷毀并回收資源,下次利用時(shí)又將重新實(shí)例化弦叶,這將導(dǎo)致共享的單例對(duì)象狀態(tài)的丟失俊犯。

總結(jié)

今天我們通過文章學(xué)習(xí)了第一個(gè)設(shè)計(jì)模式,了解了他的設(shè)計(jì)理念伤哺,學(xué)會(huì)了他的九種寫法燕侠,也認(rèn)識(shí)了他的優(yōu)缺點(diǎn)。相信大家已經(jīng)對(duì)單例模式有了一個(gè)全新的認(rèn)識(shí)立莉。(反正我寫完文章才認(rèn)識(shí)到自己原來根本不了解單例模式)

最后還是要給大家說一句話:模式是死的贬循,代碼是活的。不要硬套模式桃序。代碼會(huì)告訴你怎么做,你聽就是了烂瘫。(也是借鑒前輩們的經(jīng)驗(yàn))

設(shè)計(jì)模式目錄

設(shè)計(jì)模式(一)—— 認(rèn)識(shí)設(shè)計(jì)模式
設(shè)計(jì)模式(二)—— 技術(shù)直男正確“面向?qū)ο蟆钡牧笤瓌t
設(shè)計(jì)模式(三)—— 單例模式
設(shè)計(jì)模式(四)—— 原型模式
設(shè)計(jì)模式(五)—— 簡(jiǎn)單工廠模式

參考資料

《設(shè)計(jì)模式——可復(fù)用面向?qū)ο筌浖幕A(chǔ)》
《Head First設(shè)計(jì)模式》
《大話設(shè)計(jì)模式》
《設(shè)計(jì)模式之禪》
《Android 源碼設(shè)計(jì)模式解析與實(shí)戰(zhàn)》

單例模式媒熊,這一篇差不多了 -- Singleton is an angel but an evil!
單例模式的八種寫法比較
潛談單例模式

劉偉

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末坟比,一起剝皮案震驚了整個(gè)濱河市芦鳍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌葛账,老刑警劉巖柠衅,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異籍琳,居然都是意外死亡菲宴,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門趋急,熙熙樓的掌柜王于貴愁眉苦臉地迎上來喝峦,“玉大人,你說我怎么就攤上這事呜达∫ゴ溃” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵查近,是天一觀的道長(zhǎng)眉踱。 經(jīng)常有香客問我,道長(zhǎng)霜威,這世上最難降的妖魔是什么谈喳? 我笑而不...
    開封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮侥祭,結(jié)果婚禮上叁执,老公的妹妹穿的比我還像新娘茄厘。我一直安慰自己,他們只是感情好谈宛,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開白布次哈。 她就那樣靜靜地躺著,像睡著了一般吆录。 火紅的嫁衣襯著肌膚如雪窑滞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天恢筝,我揣著相機(jī)與錄音哀卫,去河邊找鬼。 笑死撬槽,一個(gè)胖子當(dāng)著我的面吹牛此改,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播侄柔,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼共啃,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了暂题?” 一聲冷哼從身側(cè)響起移剪,我...
    開封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎薪者,沒想到半個(gè)月后纵苛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡言津,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年攻人,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纺念。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡贝椿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出陷谱,到底是詐尸還是另有隱情烙博,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布烟逊,位于F島的核電站渣窜,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏宪躯。R本人自食惡果不足惜乔宿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望访雪。 院中可真熱鬧详瑞,春花似錦掂林、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至计寇,卻和暖如春锣杂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背番宁。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工元莫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蝶押。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓踱蠢,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親棋电。 傳聞我的和親對(duì)象是個(gè)殘疾皇子朽基,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353