JavaRush /Java Blog /Random-TL /Singleton pattern sa sarili mong salita
Roman_kh
Antas
Харьков

Singleton pattern sa sarili mong salita

Nai-publish sa grupo

Kumusta sa lahat, javaRush!

Ngayon sasabihin ko sa iyo ang tungkol sa pattern ng disenyo Singleton(single). Singleton pattern sa sarili mong salita - 1Layunin: lumikha ng isang klase na magkakaroon lamang ng ISANG bagay. Nangangahulugan ito na kahit gaano karaming beses itong ma-access, ang parehong bagay na nilikha sa unang pagkakataon ay ibabalik. Ito ay isang maginhawang bagay at kinakailangan sa maraming lugar, hindi para sa wala na ito ay ipinatupad sa mga balangkas. Application:
  • Halimbawa, kailangan mong ikonekta ang isang database sa isang proyekto at isang klase na magiging responsable para sa pagkonekta dito. Ang koneksyon ay nilikha nang isang beses at hindi na kailangang likhain ito nang paulit-ulit
  • Application settings— isang klase na responsable para sa mga setting ng koneksyon na kailangan para sa application: database host at port, atbp. Ang mga ito ay nilikha nang isang beses at ginagamit sa buong pagpapatakbo ng application.
  • Marami pang mga halimbawa na hindi ko nabanggit, kaya isulat ang iyong mga pagpipilian sa mga komento! =)
Pagkatapos ng pagpapakilalang ito, ayon sa pagkakaintindi ko, maaari tayong magpakita ng halimbawa ng klaseng ito: (Bagaman sigurado ako na ang bawat isa sa atin ay makakabuo ng pagpapatupad nito) Narito ang pinakasimpleng halimbawa, kapag ginawa nating pribado ang constructor, i.e. Hindi ka maaaring lumikha ng isang bagay nang tahasan. At mayroong isang static na pamamaraan getInstance()na nagbibigay ng isang bagay.
public class Singleton {
  private static Singleton instance;
  private Singleton () {}

  public static Singleton getInstance() {
    if (instance == null) {
      instance = new Singleton();
    }
    return instance;
  }
}
May mga problema sa multithreading at pagkatapos ay maaari kang maglagay ng getInstance()marker method synchronized:
public class Singleton {
  private static Singleton instance;
  private Singleton () {}

  public static synchronized Singleton getInstance() {
    if (instance == null) {
      instance = new Singleton();
    }
    return instance;
  }
}
Sa huli, gaya ng dati, gusto kong sabihin na kung iba ang iniisip mo o nakakita ka ng pagkakamali sa akin, sumulat sa mga komento! Tatalakayin namin ang lahat nang may kasiyahan :) Kung nagustuhan mo ang artikulo, isulat ang "+" at malalaman ko ito. Ito ay mahalaga sa akin :) PS Nagdaragdag ako ng higit pang mga pagpapatupad: Ayon kay Joshua Bloch , ito ang pinakamahusay na paraan upang ipatupad ang templateEnum Singleton
public enum Singleton {
   INSTANCE;
}
Double Checked Locking & volatile
public class Singleton {
        private static volatile Singleton instance;

        public static Singleton getInstance() {
      Singleton localInstance = instance;
      if (localInstance == null) {
         synchronized (Singleton.class) {
            localInstance = instance;
            if (localInstance == null) {
               instance = localInstance = new Singleton();
            }
         }
      }
      return localInstance;
   }
}
At higit pa On Demand Holder idiom:
public class Singleton {

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

   public static Singleton getInstance() {
      return SingletonHolder.HOLDER_INSTANCE;
   }
}
+Lazy initialization +Mataas na performance -Hindi magagamit para sa mga non-static na field ng klase Anumang mga tanong/mungkahi - sumulat sa mga komento! Tingnan din ang aking iba pang mga artikulo:
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION