netflix 模式创新_创新设计模式:单例模式
netflix 模式創(chuàng)新
單例設(shè)計(jì)模式是一種軟件設(shè)計(jì)模式,用于將類的實(shí)例化限制為一個(gè)對(duì)象。
與其他創(chuàng)建設(shè)計(jì)模式(例如抽象工廠 , 工廠和構(gòu)建器模式)相比,單例將創(chuàng)建一個(gè)對(duì)象,但也將負(fù)責(zé),因此該對(duì)象只有一個(gè)實(shí)例存在。
當(dāng)創(chuàng)建一個(gè)類作為單例時(shí),必須解決某些問題。
- 如何確保一個(gè)類只有一個(gè)實(shí)例。
- 如何輕松訪問類的唯一實(shí)例
- 類如何控制其實(shí)例化
- 如何限制一個(gè)類的實(shí)例數(shù)
假設(shè)我們有一個(gè)發(fā)送消息的類。
Messenger類。
但是,我們希望消息過程僅由Messenger類的一個(gè)實(shí)例處理。 想象一下Messenger類打開一個(gè)tcp連接(例如xmpp)并且必須保持連接活躍才能發(fā)送消息的情況。 每次我們必須發(fā)送一條消息時(shí),打開一個(gè)新的xmpp連接都是非常低效的。
因此,我們將繼續(xù)使Messenger類成為單例。
package com.gkatzioura.design.creational.singleton;public class Messenger {private static Messenger messenger = new Messenger();private Messenger() {}public static Messenger getInstance() {return messenger;}public void send(String message) {} } 如您所見,我們將Messenger構(gòu)造函數(shù)設(shè)置為私有,并使用靜態(tài)變量初始化了Messenger。
靜態(tài)變量是類級(jí)別的變量,僅當(dāng)將類加載到內(nèi)存中時(shí),內(nèi)存分配才發(fā)生一次。 這樣,我們確保將使Messenger類僅實(shí)例化一次。 一旦被調(diào)用,getInstance方法將獲取靜態(tài)Messenger實(shí)例。
顯然,以前的方法有其優(yōu)點(diǎn)和缺點(diǎn)。 我們不必?fù)?dān)心線程安全,僅在加載Messenger類時(shí)才創(chuàng)建實(shí)例。 但是,它缺乏靈活性。 考慮將配置變量傳遞給Messenger構(gòu)造器的場(chǎng)景。 使用以前的方法是不可能的。
一種解決方法是在getInstance方法上實(shí)例化Messenger類。
package com.gkatzioura.design.creational.singleton.lait;public class Messenger {private static Messenger messenger;private Messenger() {}public static Messenger getInstance() {if(messenger==null) {messenger = new Messenger();}return messenger;}public void send(String message) {} }上面的方法在某些情況下可能有效,但是在類可能在多線程環(huán)境中實(shí)例化的情況下,它會(huì)丟失線程安全性。
使我們的類線程安全的最簡(jiǎn)單方法是同步getInstance方法。
package com.gkatzioura.design.creational.singleton.lait;public class Messenger {private static Messenger messenger;private Messenger() {}public synchronized static Messenger getInstance() {if(messenger==null) {messenger = new Messenger();}return messenger;}public void send(String message) {} }那將工作。 至少將使Messenger的創(chuàng)建同步,并且不會(huì)創(chuàng)建任何重復(fù)項(xiàng)。 這種方法的問題在于,在創(chuàng)建對(duì)象時(shí)僅需要同步一次。 使用上面的代碼將導(dǎo)致不必要的開銷。
另一種方法是使用雙重檢查鎖定方法。 現(xiàn)在,經(jīng)過雙重檢查的鎖定需要格外小心,因?yàn)楹苋菀讖恼_的選擇中找出損壞的實(shí)現(xiàn) 。
最好的方法是使用volatile關(guān)鍵字實(shí)現(xiàn)延遲加載。
通過使用volatile關(guān)鍵字,我們可以防止對(duì)volatile的寫入相對(duì)于任何先前的讀取或?qū)懭脒M(jìn)行重新排序,并防止對(duì)volatile的讀取相對(duì)于隨后的任何讀取或?qū)懭脒M(jìn)行重新排序。 互斥對(duì)象也用于實(shí)現(xiàn)同步。
總而言之,我們創(chuàng)建了一個(gè)對(duì)象,并且還確保了該對(duì)象只有一個(gè)實(shí)例。 我們還確保在多線程環(huán)境中實(shí)例化對(duì)象不會(huì)有任何問題。
您可以在github上找到源代碼。
在下一篇博客文章中,我們將介紹原型模式。
另外,我還編寫了備忘單,其中包含“創(chuàng)作設(shè)計(jì)模式”的摘要。 在鏈接中注冊(cè)以接收它。
翻譯自: https://www.javacodegeeks.com/2018/03/creational-design-patterns-singleton-pattern.html
netflix 模式創(chuàng)新
總結(jié)
以上是生活随笔為你收集整理的netflix 模式创新_创新设计模式:单例模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 郭明錤称苹果 Vision Pro 头显
- 下一篇: 捷普同意比亚迪电子以约 158 亿元收购