¸üÐÂʱ¼ä:2021Äê08ÔÂ19ÈÕ16ʱ33·Ö À´Ô´:ÀÖÓãµç¾º ä¯ÀÀ´ÎÊý:
µ¥Àýģʽ(Singleton Pattern)ÊÇJavaÖÐ×î¼òµ¥µÄÉè¼ÆÄ£Ê½Ö®Ò»¡£ÕâÖÖÀàÐ͵ÄÉè¼ÆÄ£Ê½ÊôÓÚ´´½¨ÐÍģʽ£¬ËüÌṩÁËÒ»ÖÖ´´½¨¶ÔÏóµÄ×î¼Ñ·½Ê½¡£
ÕâÖÖÄ£Ê½Éæ¼°µ½Ò»¸öµ¥Ò»µÄÀ࣬¸ÃÀฺÔð´´½¨×Ô¼ºµÄ¶ÔÏó£¬Í¬Ê±È·±£Ö»Óе¥¸ö¶ÔÏó±»´´½¨¡£Õâ¸öÀàÌṩÁËÒ»ÖÖ·ÃÎÊÆäΨһµÄ¶ÔÏóµÄ·½Ê½£¬¿ÉÒÔÖ±½Ó·ÃÎÊ£¬²»ÐèҪʵÀý»¯¸ÃÀàµÄ¶ÔÏó¡£
µ¥ÀýģʽµÄÖ÷ÒªÓÐÒÔϽÇÉ«£º
·µ¥ÀýÀà¡£Ö»ÄÜ´´½¨Ò»¸öʵÀýµÄÀà
··ÃÎÊÀࡣʹÓõ¥ÀýÀà
µ¥ÀýÉè¼ÆÄ£Ê½·ÖÀàÁ½ÖÖ£º
¶öººÊ½£ºÀà¼ÓÔØ¾Í»áµ¼Ö¸õ¥ÊµÀý¶ÔÏó±»´´½¨
ÀÁººÊ½£ºÀà¼ÓÔØ²»»áµ¼Ö¸õ¥ÊµÀý¶ÔÏó±»´´½¨£¬¶øÊÇÊ×´ÎʹÓøöÔÏóʱ²Å»á´´½¨
2.1 ¶öººÊ½-·½Ê½1(¾²Ì¬±äÁ¿·½Ê½)
/**
* ¶öººÊ½
* ¾²Ì¬±äÁ¿´´½¨ÀàµÄ¶ÔÏó
*/
public class Singleton {
//˽Óй¹Ôì·½·¨
private Singleton() {}
//ÔÚ³ÉԱλÖô´½¨¸ÃÀàµÄ¶ÔÏó
private static Singleton instance = new Singleton();
//¶ÔÍâÌṩ¾²Ì¬·½·¨»ñÈ¡¸Ã¶ÔÏó
public static Singleton getInstance() {
return instance;
}
}
˵Ã÷£º
¸Ã·½Ê½ÔÚ³ÉԱλÖÃÉùÃ÷SingletonÀàÐ͵ľ²Ì¬±äÁ¿£¬²¢´´½¨SingletonÀàµÄ¶ÔÏóinstance¡£instance¶ÔÏóÊÇËæ×ÅÀàµÄ¼ÓÔØ¶ø´´½¨µÄ¡£Èç¹û¸Ã¶ÔÏó×ã¹»´óµÄ»°£¬¶øÒ»Ö±Ã»ÓÐʹÓþͻáÔì³ÉÄÚ´æµÄÀË·Ñ¡£
2.2 ¶öººÊ½-·½Ê½2(¾²Ì¬´úÂë¿é·½Ê½)
/**
* ¶ñººÊ½
* ÔÚ¾²Ì¬´úÂë¿éÖд´½¨¸ÃÀà¶ÔÏó
*/
public class Singleton {
//˽Óй¹Ôì·½·¨
private Singleton() {}
//ÔÚ³ÉԱλÖô´½¨¸ÃÀàµÄ¶ÔÏó
private static Singleton instance;
static {
instance = new Singleton();
}
//¶ÔÍâÌṩ¾²Ì¬·½·¨»ñÈ¡¸Ã¶ÔÏó
public static Singleton getInstance() {
return instance;
}
}
˵Ã÷£º
¸Ã·½Ê½ÔÚ³ÉԱλÖÃÉùÃ÷SingletonÀàÐ͵ľ²Ì¬±äÁ¿£¬¶ø¶ÔÏóµÄ´´½¨ÊÇÔÚ¾²Ì¬´úÂë¿éÖУ¬Ò²ÊǶÔ×ÅÀàµÄ¼ÓÔØ¶ø´´½¨¡£ËùÒԺͶöººÊ½µÄ·½Ê½1»ù±¾ÉÏÒ»Ñù£¬µ±È»¸Ã·½Ê½Ò²´æÔÚÄÚ´æÀË·ÑÎÊÌâ¡£
2.3 ÀÁººÊ½-·½Ê½1(Ï̲߳»°²È«)
/**
* ÀÁººÊ½
* Ï̲߳»°²È«
*/
public class Singleton {
//˽Óй¹Ôì·½·¨
private Singleton() {}
//ÔÚ³ÉԱλÖô´½¨¸ÃÀàµÄ¶ÔÏó
private static Singleton instance;
//¶ÔÍâÌṩ¾²Ì¬·½·¨»ñÈ¡¸Ã¶ÔÏó
public static Singleton getInstance() {
if(instance == null) {
instance = new Singleton();
}
return instance;
}
}
˵Ã÷£º
´ÓÉÏÃæ´úÂëÎÒÃÇ¿ÉÒÔ¿´³ö¸Ã·½Ê½ÔÚ³ÉԱλÖÃÉùÃ÷SingletonÀàÐ͵ľ²Ì¬±äÁ¿£¬²¢Ã»ÓнøÐжÔÏóµÄ¸³Öµ²Ù×÷£¬ÄÇôʲôʱºò¸³ÖµµÄÄØ?µ±µ÷ÓÃgetInstance()·½·¨»ñÈ¡SingletonÀàµÄ¶ÔÏóµÄʱºò²Å´´½¨SingletonÀàµÄ¶ÔÏó£¬ÕâÑù¾ÍʵÏÖÁËÀÁ¼ÓÔØµÄЧ¹û¡£µ«ÊÇ£¬Èç¹ûÊǶàÏ̻߳·¾³£¬»á³öÏÖḬ̈߳²È«ÎÊÌâ¡£
2.4 ÀÁººÊ½-·½Ê½2(Ḭ̈߳²È«)
/**
* ÀÁººÊ½
* Ḭ̈߳²È«
*/
public class Singleton {
//˽Óй¹Ôì·½·¨
private Singleton() {}
//ÔÚ³ÉԱλÖô´½¨¸ÃÀàµÄ¶ÔÏó
private static Singleton instance;
//¶ÔÍâÌṩ¾²Ì¬·½·¨»ñÈ¡¸Ã¶ÔÏó
public static synchronized Singleton getInstance() {
if(instance == null) {
instance = new Singleton();
}
return instance;
}
}
˵Ã÷£º
¸Ã·½Ê½Ò²ÊµÏÖÁËÀÁ¼ÓÔØÐ§¹û£¬Í¬Ê±ÓÖ½â¾öÁËḬ̈߳²È«ÎÊÌâ¡£µ«ÊÇÔÚgetInstance()·½·¨ÉÏÌí¼ÓÁËsynchronized¹Ø¼ü×Ö£¬µ¼Ö¸÷½·¨µÄÖ´ÐÐЧ¹ûÌØ±ðµÍ¡£´ÓÉÏÃæ´úÂëÎÒÃÇ¿ÉÒÔ¿´³ö£¬Æäʵ¾ÍÊÇÔÚ³õʼ»¯instanceµÄʱºò²Å»á³öÏÖḬ̈߳²È«ÎÊÌ⣬һµ©³õʼ»¯Íê³É¾Í²»´æÔÚÁË¡£
2.5 ÀÁººÊ½-·½Ê½3(Ë«ÖØ¼ì²éËø)
/**
* Ë«ÖØ¼ì²é·½Ê½
*/
public class Singleton {
//˽Óй¹Ôì·½·¨
private Singleton() {}
private static Singleton instance;
//¶ÔÍâÌṩ¾²Ì¬·½·¨»ñÈ¡¸Ã¶ÔÏó
public static Singleton getInstance() {
//µÚÒ»´ÎÅжϣ¬Èç¹ûinstance²»Îªnull£¬²»½øÈëÇÀËø½×¶Î£¬Ö±½Ó·µ»ØÊµÀý
if(instance == null) {
synchronized (Singleton.class) {
//ÇÀµ½ËøÖ®ºóÔÙ´ÎÅжÏÊÇ·ñΪnull
if(instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
ÔÙÀ´ÌÖÂÛÒ»ÏÂÀÁººÄ£Ê½ÖмÓËøµÄÎÊÌ⣬¶ÔÓÚ getInstance() ·½·¨À´Ëµ£¬¾ø´ó²¿·ÖµÄ²Ù×÷¶¼ÊǶÁ²Ù×÷£¬¶Á²Ù×÷ÊÇḬ̈߳²È«µÄ£¬ËùÒÔÎÒÃÇû±ØÈÃÿ¸öÏ̱߳ØÐë³ÖÓÐËø²ÅÄܵ÷Óø÷½·¨£¬ÎÒÃÇÐèÒªµ÷Õû¼ÓËøµÄʱ»ú¡£ÓÉ´ËÒ²²úÉúÁËÒ»ÖÖеÄʵÏÖģʽ£ºË«Öؼì²éËøÄ£Ê½
Ë«ÖØ¼ì²éËøÄ£Ê½ÊÇÒ»Öַdz£ºÃµÄµ¥ÀýʵÏÖģʽ£¬½â¾öÁ˵¥Àý¡¢ÐÔÄÜ¡¢Ḭ̈߳²È«ÎÊÌ⣬ÉÏÃæµÄË«ÖØ¼ì²âËøÄ£Ê½¿´ÉÏÈ¥ÍêÃÀÎÞȱ£¬ÆäʵÊÇ´æÔÚÎÊÌ⣬ÔÚ¶àÏ̵߳ÄÇé¿öÏ£¬¿ÉÄÜ»á³öÏÖ¿ÕÖ¸ÕëÎÊÌ⣬³öÏÖÎÊÌâµÄÔÒòÊÇJVMÔÚʵÀý»¯¶ÔÏóµÄʱºò»á½øÐÐÓÅ»¯ºÍÖ¸ÁîÖØÅÅÐò²Ù×÷¡£
Òª½â¾öË«ÖØ¼ì²éËøÄ£Ê½´øÀ´¿ÕÖ¸ÕëÒì³£µÄÎÊÌ⣬ֻÐèҪʹÓà volatile ¹Ø¼ü×Ö, volatile ¹Ø¼ü×Ö¿ÉÒÔ±£Ö¤¿É¼ûÐÔºÍÓÐÐòÐÔ¡£
/**
* Ë«ÖØ¼ì²é·½Ê½
*/
public class Singleton {
//˽Óй¹Ôì·½·¨
private Singleton() {}
private static volatile Singleton instance;
//¶ÔÍâÌṩ¾²Ì¬·½·¨»ñÈ¡¸Ã¶ÔÏó
public static Singleton getInstance() {
//µÚÒ»´ÎÅжϣ¬Èç¹ûinstance²»Îªnull£¬²»½øÈëÇÀËø½×¶Î£¬Ö±½Ó·µ»ØÊµ¼Ê
if(instance == null) {
synchronized (Singleton.class) {
//ÇÀµ½ËøÖ®ºóÔÙ´ÎÅжÏÊÇ·ñΪ¿Õ
if(instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
С½á£º
Ìí¼Ó volatile ¹Ø¼ü×ÖÖ®ºóµÄË«ÖØ¼ì²éËøÄ£Ê½ÊÇÒ»ÖֱȽϺõĵ¥ÀýʵÏÖģʽ£¬Äܹ»±£Ö¤ÔÚ¶àÏ̵߳ÄÇé¿öÏÂḬ̈߳²È«Ò²²»»áÓÐÐÔÄÜÎÊÌâ¡£
2.6 ÀÁººÊ½-·½Ê½4(¾²Ì¬ÄÚ²¿À෽ʽ)
¾²Ì¬ÄÚ²¿À൥ÀýģʽÖÐʵÀýÓÉÄÚ²¿Àà´´½¨£¬ÓÉÓÚ JVM ÔÚ¼ÓÔØÍⲿÀàµÄ¹ý³ÌÖÐ, ÊDz»»á¼ÓÔØ¾²Ì¬ÄÚ²¿ÀàµÄ, Ö»ÓÐÄÚ²¿ÀàµÄÊôÐÔ/·½·¨±»µ÷ÓÃʱ²Å»á±»¼ÓÔØ, ²¢³õʼ»¯Æä¾²Ì¬ÊôÐÔ¡£¾²Ì¬ÊôÐÔÓÉÓÚ±» static ÐÞÊΣ¬±£Ö¤Ö»±»ÊµÀý»¯Ò»´Î£¬²¢ÇÒÑϸñ±£Ö¤ÊµÀý»¯Ë³Ðò¡£
/**
* ¾²Ì¬ÄÚ²¿À෽ʽ
*/
public class Singleton {
//˽Óй¹Ôì·½·¨
private Singleton() {}
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
//¶ÔÍâÌṩ¾²Ì¬·½·¨»ñÈ¡¸Ã¶ÔÏó
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
˵Ã÷£º
µÚÒ»´Î¼ÓÔØSingletonÀàʱ²»»áÈ¥³õʼ»¯INSTANCE£¬Ö»ÓеÚÒ»´Îµ÷ÓÃgetInstance£¬ÐéÄâ»ú¼ÓÔØSingletonHolder
²¢³õʼ»¯INSTANCE£¬ÕâÑù²»½öÄÜÈ·±£Ḭ̈߳²È«£¬Ò²Äܱ£Ö¤ Singleton ÀàµÄΨһÐÔ¡£
С½á£º
¾²Ì¬ÄÚ²¿À൥ÀýģʽÊÇÒ»ÖÖÓÅÐãµÄµ¥Àýģʽ£¬ÊÇ¿ªÔ´ÏîÄ¿ÖбȽϳ£ÓõÄÒ»ÖÖµ¥Àýģʽ¡£ÔÚûÓмÓÈκÎËøµÄÇé¿öÏ£¬±£Ö¤Á˶àÏß³Ìϵݲȫ£¬²¢ÇÒûÓÐÈκÎÐÔÄÜÓ°ÏìºÍ¿Õ¼äµÄÀË·Ñ¡£
2.7 ö¾Ù·½Ê½
ö¾ÙÀàʵÏÖµ¥ÀýģʽÊǼ«Á¦ÍƼöµÄµ¥ÀýʵÏÖģʽ£¬ÒòΪö¾ÙÀàÐÍÊÇḬ̈߳²È«µÄ£¬²¢ÇÒÖ»»á×°ÔØÒ»´Î£¬Éè¼ÆÕß³ä·ÖµÄÀûÓÃÁËö¾ÙµÄÕâ¸öÌØÐÔÀ´ÊµÏÖµ¥Àýģʽ£¬Ã¶¾ÙµÄд·¨·Ç³£¼òµ¥£¬¶øÇÒö¾ÙÀàÐÍÊÇËùÓõ¥ÀýʵÏÖÖÐΨһһÖÖ²»»á±»ÆÆ»µµÄµ¥ÀýʵÏÖģʽ¡£
<br class="Apple-interchange-newline"><div></div>
/**
* ö¾Ù·½Ê½
*/
public enum Singleton {
INSTANCE;
}
˵Ã÷£º
ö¾Ù·½Ê½ÊôÓÚ¶ñººÊ½·½Ê½¡£

²ÂÄãϲ»¶£º
ʲôÊǵ¥Àýģʽ?Óм¸ÖÖ?
µ¥Àýģʽ½Ì³Ì£ºµ¥ÀýģʽµÄ¼¸ÖÖʵÏÖ·½Ê½
JavaÉè¼ÆÄ£Ê½Ö®µ¥ÀýģʽÒÔ¼°µ¥ÀýËùÒý·¢µÄ˼¿¼
ÀÖÓãµç¾ºjava¿ª·¢Åàѵ¿Î³Ì
±±¾©Ð£Çø