JavaRush /Блоги Java /Random-TG /Намунаҳои тарроҳӣ: Singleton

Намунаҳои тарроҳӣ: Singleton

Дар гурӯҳ нашр шудааст
Салом! Имрӯз мо намунаҳои гуногуни тарроҳиро бодиққат дида мебароем ва мо бо намунаи Singleton оғоз мекунем, ки онро "singleton" низ меноманд. Намунаҳои тарроҳӣ: Singleton - 1Биёед дар хотир дорем: мо дар бораи намунаҳои тарроҳӣ умуман чӣ медонем? Намунаҳои тарроҳӣ таҷрибаҳои беҳтарин мебошанд, ки онҳоро барои ҳалли як қатор мушкилоти маълум пайравӣ кардан мумкин аст. Намунаҳои тарроҳӣ одатан ба ягон забони барномасозӣ алоқаманд нестанд. Онҳоро ҳамчун маҷмӯи тавсияҳо қабул кунед, ки пас аз он шумо метавонед аз хатогиҳо канорагирӣ кунед ва чархи худро дубора ихтироъ накунед.

Синглтон чист?

Синглтон яке аз соддатарин намунаҳои тарроҳӣ мебошад, ки метавонад ба синф татбиқ карда шавад. Баъзан одамон мегӯянд, ки "ин синф як синглтон аст", яъне ин синф намунаи тарроҳии синглтонро амалӣ мекунад. Баъзан синферо навиштан лозим аст, ки барои он танҳо як an object сохта мешавад. Масалан, синфе, ки барои сабт ё пайвастшавӣ ба пойгоҳи додаҳо масъул аст. Намунаи тарроҳии Singleton тасвир мекунад, ки чӣ гуна мо метавонем чунин вазифаро иҷро кунем. Синглтон як намунаи тарроҳӣ мебошад, ки ду чизро иҷро мекунад:
  1. Кафолат медиҳад, ки синф танҳо як мисоли синфро дорад.

  2. Нуқтаи дастрасии глобалиро ба мисоли ин синф таъмин мекунад.

Аз ин рӯ, ду хусусият вуҷуд доранд, ки қариб ҳар як амалисозии намунаи синглтон хосанд:
  1. Конструктори хусусӣ. Қобorяти эҷоди an objectҳои синфро берун аз худи синф маҳдуд мекунад.

  2. Усули статикии оммавӣ, ки намунаи синфро бармегардонад. Ин усул номида мешавад getInstance. Ин нуқтаи дастрасии глобалӣ ба мисоли синф аст.

Вариантҳои татбиқ

Намунаи тарроҳии singleton бо роҳҳои гуногун истифода мешавад. Ҳар як вариант ба таври худ хуб ва бад аст. Дар ин ҷо, чун ҳамеша: идеал нест, аммо шумо бояд барои он кӯшиш кунед. Аммо пеш аз ҳама, биёед муайян кунем, ки чӣ хуб аст ва чӣ бад аст ва кадом нишондиҳандаҳо ба арзёбии татбиқи намунаи тарҳрезӣ таъсир мерасонанд. Биёед бо мусбат оғоз кунем. Инҳоянд меъёрҳое, ки ба татбиқи болаззат ва ҷолибият медиҳанд:
  • Оғозкунии танбал: вақте ки синф ҳангоми кор кардани барнома маҳз вақте лозим аст, бор карда мешавад.

  • Содда ва шаффофияти code: метрика, албатта, субъективӣ, аммо муҳим аст.

  • Бехатарии ришта: дар муҳити чанд ришта дуруст кор мекунад.

  • Иҷрои баланд дар муҳити чанд ришта: риштаҳо ҳангоми мубодилаи манбаъ ҳамдигарро ба ҳадди ақал мебанданд ё тамоман не.

Акнун манфии. Биёед меъёрҳоеро номбар кунем, ки татбиқро дар нури бад нишон медиҳанд:
  • Оғозкунии танбалӣ: вақте ки синф ҳангоми оғоз кардани барнома, новобаста аз он ки он лозим аст ё не (парадокс, дар ҷаҳони IT танбал будан беҳтар аст)

  • Мушкилот ва хониши сусти code. Метрик низ субъективӣ аст. Фарз мекунем, ки агар аз чашм хун ояд, амалй со-кин аст.

  • Набудани бехатарии ришта. Ба ибораи дигар, "хатари ришта". Амали нодуруст дар муҳити чанд ришта.

  • Иҷрои суст дар муҳити чанд ришта: риштаҳо ҳама вақт ё аксар вақт ҳангоми мубодилаи манбаъ ҳамдигарро маҳкам мекунанд.

Кодекс

Ҳоло мо омодаем, ки вариантҳои гуногуни татбиқро баррасӣ кунем, бо номбар кардани ҷиҳатҳои мусбӣ ва манфии:

Ҳалли оддӣ

public class Singleton {
    private static final Singleton INSTANCE = new Singleton();

    private Singleton() {
    }

    public static Singleton getInstance() {
        return INSTANCE;
    }
}
Татбиқи соддатарин. Тарафдор:
  • Содда ва шаффофияти code

  • Бехатарии ришта

  • Иҷрои баланд дар муҳити бисёрсоҳавӣ

Камбудиҳо:
  • Оғозкунии танбал нест.
Дар кӯшиши ислоҳ кардани камбудии охирин, мо рақами дуюмро иҷро мекунем:

Ташаббуси танбалӣ

public class Singleton {
  private static Singleton INSTANCE;

  private Singleton() {}

  public static Singleton getInstance() {
    if (INSTANCE == null) {
      INSTANCE = new Singleton();
    }
    return INSTANCE;
  }
}
Тарафдор:
  • Оғозсозии танбал.

Камбудиҳо:
  • Ришта бехатар нест

Татбиқи он ҷолиб аст. Мо метавонем танбалро оғоз кунем, аммо мо бехатарии риштаро аз даст додем. Мушкил нест: дар амалисозии рақами сеюм мо ҳама чизро ҳамоҳанг мекунем.

Аксессори ҳамоҳангшуда

public class Singleton {
  private static Singleton INSTANCE;

  private Singleton() {
  }

  public static synchronized Singleton getInstance() {
    if (INSTANCE == null) {
      INSTANCE = new Singleton();
    }
    return INSTANCE;
  }
}
Тарафдор:
  • Оғозсозии танбал.

  • Бехатарии ришта

Камбудиҳо:
  • Иҷрои суст дар муҳити чанд ришта

Аҷоиб! Дар амалисозии рақами се, мо бехатарии риштаро баргардондем! Дуруст, суст аст... Ҳоло усул getInstanceҳамоҳанг карда шудааст ва шумо метавонед онро дар як вақт ворид кунед. Дар асл, ба мо лозим нест, ки тамоми усулро ҳамоҳанг созем, балки танҳо он қисми он, ки дар он мо an objectи синфи навро оғоз мекунем. Аммо мо наметавонем synchronizedқисматеро, ки барои сохтани an objectи нав дар блок масъул аст, печонем: ин бехатарии риштаро таъмин намекунад. Ин каме мураккабтар аст. Усули дурусти ҳамоҳангсозӣ дар зер оварда шудааст:

Қулфи дукарата санҷидашуда

public class Singleton {
    private static Singleton INSTANCE;

  private Singleton() {
  }

    public static Singleton getInstance() {
        if (INSTANCE == null) {
            synchronized (Singleton.class) {
                if (INSTANCE == null) {
                    INSTANCE = new Singleton();
                }
            }
        }
        return INSTANCE;
    }
}
Тарафдор:
  • Оғозсозии танбал.

  • Бехатарии ришта

  • Иҷрои баланд дар муҳити бисёрсоҳавӣ

Камбудиҳо:
  • Дар versionҳои Java камтар аз 1.5 дастгирӣ намешавад (калимаи калидӣ дар versionи 1.5 ислоҳ карда шудааст)

Ман қайд мекунам, ки барои дуруст кор кардани ин варианти амалӣ яке аз ду шарт зарур аст. Тағирёбанда INSTANCEбояд ё бошад final, ё volatile. Иҷрои охирине, ки мо имрӯз муҳокима хоҳем кард Class Holder Singleton.

Дорандаи синфи Singleton

public class Singleton {

   private Singleton() {
   }

   private static class SingletonHolder {
       public static final Singleton HOLDER_INSTANCE = new Singleton();
   }

   public static Singleton getInstance() {
       return SingletonHolder.HOLDER_INSTANCE;
   }
}
Тарафдор:
  • Оғозсозии танбал.

  • Бехатарии ришта.

  • Иҷрои баланд дар муҳити бисёрсоҳавӣ.

Камбудиҳо:
  • Барои дуруст кор кардан, кафолат додан лозим аст, ки an objectи синф Singletonбе хато оғоз карда мешавад. Дар акси ҳол, занги усули аввал getInstanceбо хатогӣ анҷом меёбад ExceptionInInitializerErrorва ҳамаи зангҳои минбаъда ноком мешаванд NoClassDefFoundError.

Татбиқи он қариб комил аст. Ва танбал, ва ришта бехатар ва зуд. Аммо як нозуки дар минус тасвир шудааст. Ҷадвали муқоисавии татбиқҳои гуногуни намунаи Singleton:
Амалй Оғозсозии танбал Бехатарии ришта Суръати чанд ришта Кай истифода бурдан мумкин аст?
Ҳалли оддӣ - + Тез Ҳеҷ гоҳ. Ё вақте ки оғози танбал муҳим нест. Аммо ҳеҷ гоҳ беҳтар.
Ташаббуси танбалӣ + - Иҷронашаванда Ҳамеша вақте ки чанд ришта лозим нест
Аксессори ҳамоҳангшуда + + Оҳиста-оҳиста Ҳеҷ гоҳ. Ё вақте ки суръати кор бо multithreading аҳамият надорад. Аммо ҳеҷ гоҳ беҳтар
Қулфи дукарата санҷидашуда + + Тез Дар ҳолатҳои нодир, вақте ки шумо бояд ҳангоми сохтани синглтон истисноҳоро ҳал кунед. (вақте ки Class Holder Singleton татбиқ намешавад)
Дорандаи синфи Singleton + + Тез Ҳамеша вақте ки чанд ришта лозим аст ва кафолат вуҷуд дорад, ки an objectи синфи singleton бе мушкилот эҷод карда мешавад.

Тарафҳо ва нуқсонҳои намунаи Singleton

Умуман, синглтон он чизеро, ки аз он интизор аст, иҷро мекунад:
  1. Кафолат медиҳад, ки синф танҳо як мисоли синфро дорад.

  2. Нуқтаи дастрасии глобалиро ба мисоли ин синф таъмин мекунад.

Бо вуҷуди ин, ин намуна камбудиҳо дорад:
  1. Singleton SRP (Principle Single Responsibility Principle)-ро вайрон мекунад - синфи Singleton, ба ғайр аз масъулиятҳои бевоситаи худ, шумораи нусхаҳои онро низ назорат мекунад.

  2. Вобастагии синф ё усули муқаррарӣ аз синглтон дар шартномаи ҷамъиятии синф намоён нест.

  3. Тағйирёбандаҳои глобалӣ бад мебошанд. Синглтон дар ниҳоят ба як тағирёбандаи глобалӣ табдил меёбад.

  4. Мавҷудияти синглтон қобorяти санҷиши барномаро дар маҷмӯъ ва синфҳоеро, ки синглтонро истифода мебаранд, коҳиш медиҳад.

Хуб, ҳамааш тамом шуд. Мо ба намунаи тарроҳии синглтон назар кардем. Акнун, дар як сӯҳбати якумрӣ бо дӯстони барномасози худ, шумо метавонед на танҳо дар бораи он чӣ хуб аст, балки чанд сухан дар бораи он ки чӣ бад аст, бигӯед. Муваффақият дар азхудкунии донишҳои нав.

Хониши иловагӣ:

Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION