CodeGym /جاوا بلاگ /Random-SD /جاوا سنگلٽن ڪلاس
John Squirrels
سطح
San Francisco

جاوا سنگلٽن ڪلاس

گروپ ۾ شايع ٿيل
سلام اڄ اسين جاوا سنگلٽن جي نمونن سان شروع ٿيندڙ مختلف ڊيزائن جي نمونن جي تفصيل ۾ غور ڪنداسين. اچو ته جائزو وٺون: اسان عام طور تي ڊزائن جي نمونن بابت ڇا ڄاڻون ٿا؟ ڊيزائن جا نمونا بهترين طريقا آھن جيڪي اسان ڪيترن ئي سڃاتل مسئلن کي حل ڪرڻ لاءِ لاڳو ڪري سگھون ٿا. ڊيزائن جا نمونا عام طور تي ڪنهن به پروگرامنگ ٻولي سان ڳنڍيل نه آهن. انهن جي باري ۾ سوچيو ته سفارشن جي هڪ سيٽ جي طور تي توهان جي غلطين کان بچڻ ۽ سائيڪل کي ٻيهر بحال ڪرڻ کان بچڻ لاء.ڊيزائن جا نمونا: سنگلٽن - 1

جاوا ۾ سنگلٽن ڇا آهي؟

سنگلٽن هڪ آسان ترين طبقي سطح جي ڊيزائن جي نمونن مان هڪ آهي. ڪڏهن ڪڏهن ماڻهو چوندا آهن "هي ڪلاس سنگلٽن آهي"، جنهن جو مطلب آهي ته ڪلاس سنگلٽن ڊيزائن جي نموني کي لاڳو ڪري ٿو. ڪڏهن ڪڏهن اهو ضروري هوندو آهي ته هڪ ڪلاس لکڻو هجي جتي اسان انسٽنٽيشن کي صرف هڪ اعتراض تائين محدود رکون ٿا. مثال طور، هڪ ڪلاس لاگ ان ڪرڻ يا ڳنڍڻ جو ذميوار ڊيٽابيس. سنگلٽن ڊيزائن جو نمونو بيان ڪري ٿو ته اسان اهو ڪيئن حاصل ڪري سگهون ٿا. سنگلٽن هڪ ڊزائن جو نمونو آهي جيڪو ٻه شيون ڪري ٿو:
  1. اها ضمانت ڏئي ٿي ته ڪلاس جو صرف هڪ مثال هوندو.

  2. اهو انهي مثال تائين عالمي رسائي جو هڪ واحد نقطو مهيا ڪري ٿو.

انهيء ڪري، اتي ٻه خاصيتون آهن جيڪي خاص طور تي سنگلٽن جي نموني جي تقريبن هر عمل جي خاصيت آهن:
  1. هڪ خانگي تعمير ڪندڙ. هي طبقن جي شيون ٺاهڻ جي صلاحيت کي محدود ڪري ٿو ڪلاس کان ٻاهر.

  2. ھڪڙو عوامي جامد طريقو جيڪو ڪلاس جو مثال ڏئي ٿو. اهو طريقو سڏيو ويندو آهي getInstance . هي ڪلاس مثال تائين عالمي رسائي جو نقطو آهي.

لاڳو ڪرڻ جا اختيار

سنگلٽن ڊيزائن جو نمونو مختلف طريقن سان لاڳو ٿئي ٿو. هر اختيار پنهنجي طريقي سان سٺو ۽ خراب آهي. هميشه وانگر، هتي ڪو به ڀرپور اختيار ناهي، پر اسان کي هڪ لاء ڪوشش ڪرڻ گهرجي. سڀ کان پهريان، اچو ته اهو فيصلو ڪريون ته ڪهڙي شيءِ سٺي ۽ خراب آهي، ۽ ڪهڙيون ماپون اثر انداز ٿين ٿيون ته اسان ڊزائن جي نمونن جي مختلف عملن جو اندازو ڪيئن ڪريون ٿا. اچو ته سٺي سان شروع ڪريون. هتي اهڙا عنصر آهن جيڪي عمل درآمد کي وڌيڪ رسيل ۽ اپيل ڪن ٿا:
  • سست شروعات: مثال پيدا نه ڪيو وڃي جيستائين اهو گهربل هجي.

  • سادي ۽ شفاف ڪوڊ: هي ميٽرڪ، يقينا، موضوعي آهي، پر اهو اهم آهي.

  • موضوع جي حفاظت: هڪ گھڻن موضوعن واري ماحول ۾ صحيح آپريشن.

  • گھڻن موضوعن واري ماحول ۾ اعلي ڪارڪردگي: وسيلا شيئر ڪرڻ وقت ٿورڙو يا ڪو ٿريڊ بلاڪ ڪرڻ.

هاڻي نقصان. اسان فڪٽرن کي لسٽ ڪنداسين جيڪي خراب روشني ۾ عمل درآمد ڪن ٿا:
  • ڪابه سست شروعات ناهي: جڏهن ڪلاس لوڊ ڪيو ويندو آهي جڏهن ايپليڪيشن شروع ٿئي ٿي، قطع نظر ان جي ضرورت آهي يا نه (متضاد طور تي، آئي ٽي دنيا ۾ اهو بهتر آهي سست ٿيڻ)

  • پيچيده ۽ ڏکيو-پڙهڻ ڪوڊ. هي ميٽرڪ پڻ تابع آهي. جيڪڏهن توهان جون اکيون رت وهڻ شروع ڪن، اسان سمجهون ٿا ته عمل درآمد بهترين نه آهي.

  • تارن جي حفاظت جي کوٽ. ٻين لفظن ۾، "خطرو". گھڻن موضوعن واري ماحول ۾ غلط آپريشن.

  • گهڻن موضوعن واري ماحول ۾ خراب ڪارڪردگي: موضوع هڪ ٻئي کي هر وقت بلاڪ ڪندا آهن يا اڪثر ڪري جڏهن وسيلن کي حصيداري ڪندا آهن.

ڪوڊ

ھاڻي اسان تيار آھيون مختلف عمل درآمد جي اختيارن تي غور ڪرڻ ۽ نفعو ۽ نقصان جي نشاندهي ڪرڻ لاءِ:

سادو

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

    private Singleton() {
    }

    public static Singleton getInstance() {
        return INSTANCE;
    }
}
آسان ترين عمل. فائدا:
  • سادي ۽ شفاف ڪوڊ

  • تار جي حفاظت

  • گھڻن موضوعن واري ماحول ۾ اعلي ڪارڪردگي

نقصان:
  • ڪابه سست شروعات.
اڳئين نقص کي درست ڪرڻ جي ڪوشش ۾، اسان حاصل ڪريون ٿا عملدرآمد نمبر ٻه:

سست شروعات

public class Singleton {
  private static final Singleton INSTANCE;

  private Singleton() {}

  public static Singleton getInstance() {
    if (INSTANCE == null) {
      INSTANCE = new Singleton();
    }
    return INSTANCE;
  }
}
فائدا:
  • سست شروعات.

نقصان:
  • نه تار محفوظ

اهو عمل دلچسپ آهي. اسان سستي سان شروع ڪري سگهون ٿا، پر اسان موضوع جي حفاظت کي وڃائي ڇڏيو آهي. پريشان نه ٿيو - اسان عمل درآمد نمبر ٽي ۾ هر شي کي هم وقت سازي ڪندا آهيون.

هم وقت رسائي

public class Singleton {
  private static final Singleton INSTANCE;

  private Singleton() {
  }

  public static synchronized Singleton getInstance() {
    if (INSTANCE == null) {
      INSTANCE = new Singleton();
    }
    return INSTANCE;
  }
}
فائدا:
  • سست شروعات.

  • تار جي حفاظت

نقصان:
  • ضعيف multithreaded ڪارڪردگي

تمام سٺو! عمل درآمد نمبر ٽي ۾، اسان موضوع جي حفاظت کي بحال ڪريون ٿا! يقينن، اهو سست آهي... هاڻي getInstance طريقو هم وقت سازي ڪيو ويو آهي، تنهنڪري ان کي هڪ وقت ۾ صرف هڪ ٿريڊ ذريعي هلائي سگهجي ٿو. بلڪه پوري طريقي کي هم وقت سازي ڪرڻ جي بجاءِ، اسان کي اصل ۾ صرف ان جي حصي کي هم وقت سازي ڪرڻ جي ضرورت آهي جيڪا نئين مثال جي شروعات ڪري ٿي. پر اسان صرف هڪ هم وقت ساز بلاڪ استعمال نٿا ڪري سگهون ته نئين مثال ٺاهڻ جي ذميوار حصي کي لفافي ڪرڻ لاءِ. ائين ڪرڻ سان ٿريڊ جي حفاظت يقيني نه ٿيندي. اهو سڀ ڪجهه وڌيڪ پيچيده آهي. مناسب هم وقت سازي هيٺ ڏسي سگھجي ٿو:

ٻه ڀيرا چيڪ ٿيل تالا

public class Singleton {
    private static final Singleton INSTANCE;

  private Singleton() {
  }

    public static Singleton getInstance() {
        if (INSTANCE == null) {
            synchronized (Singleton.class) {
                if (INSTANCE == null) {
                    INSTANCE = new Singleton();
                }
            }
        }
        return INSTANCE;
    }
}
فائدا:
  • سست شروعات.

  • تار جي حفاظت

  • گھڻن موضوعن واري ماحول ۾ اعلي ڪارڪردگي

نقصان:
  • 1.5 کان هيٺ جاوا جي اڳئين ورزن ۾ سپورٽ نه ڪئي وئي (1.5 ورزن کان وٺي غير مستحڪم لفظ جو استعمال مقرر ٿيل آهي)

نوٽ ڪريو ته ھن عمل درآمد جي اختيار لاءِ صحيح ڪم ڪرڻ لاءِ، ٻن شرطن مان ھڪڙي کي پورو ڪرڻ گھرجي. INSTANCE متغير لازمي يا حتمي يا غير مستحڪم هجي . آخري عمل جنهن تي اسين اڄ بحث ڪنداسين اهو آهي ڪلاس هولڊر سنگلٽن .

ڪلاس هولڊر

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;
   }
}
فائدا:
  • سست شروعات.

  • تار جي حفاظت.

  • گھڻن موضوعن واري ماحول ۾ اعلي ڪارڪردگي.

نقصان:
  • صحيح آپريشن کي ضمانت جي ضرورت آهي ته سنگلٽن اعتراض بغير غلطين جي شروعات ڪئي وئي آهي. ٻي صورت ۾، getInstance طريقي جي پهرين ڪال جو نتيجو ٿيندو ExceptionInInitializerError ، ۽ سڀ ايندڙ ڪالون هڪ NoClassDefFoundError پيدا ڪنديون .

اهو عمل تقريبا ڀرپور آهي. اهو سست آهي، ۽ موضوع محفوظ، ۽ تيز آهي. پر ان ۾ هڪ nuance آهي، جيئن ضابطن جي فهرست ۾ وضاحت ڪئي وئي آهي. سنگلٽن نمونن جي مختلف عملن جو مقابلو:
عمل درآمد سست شروعات تار جي حفاظت گھڻائي واري ڪارڪردگي جڏهن استعمال ڪرڻ لاء؟
سادو - + تڪڙو ڪڏهن به نه. يا ممڪن طور تي جڏهن سست شروعات اهم ناهي. پر ڪڏهن به بهتر نه ٿيندو.
سست شروعات + - لاڳو نٿو ٿئي هميشه جڏهن multithreading جي ضرورت نه آهي
هم وقت رسائي + + آهستي ڪڏهن به نه. يا ممڪن طور تي جڏهن multithreaded ڪارڪردگي ڪا به اهميت نه رکندو آھي. پر ڪڏهن به بهتر نه ٿيندو.
ٻه ڀيرا چيڪ ٿيل تالا + + تڪڙو نادر ڪيسن ۾ جڏهن سنگلٽن ٺاهڻ وقت توهان کي استثنا کي سنڀالڻ جي ضرورت آهي (جڏهن ڪلاس هولڊر سنگلٽن لاڳو نه هجي)
ڪلاس هولڊر + + تڪڙو جڏهن ته multithreading جي ضرورت آهي ۽ اتي هڪ ضمانت آهي ته singleton اعتراض پيدا ڪيو ويندو بغير ڪنهن مسئلن.

سنگلٽن جي نموني جا فائدا ۽ نقصان

عام طور تي، هڪ سنگلٽن اهو ئي ڪري ٿو جيڪو ان جي توقع آهي:
  1. اها ضمانت ڏئي ٿي ته ڪلاس جو صرف هڪ مثال هوندو.

  2. اهو انهي مثال تائين عالمي رسائي جو هڪ واحد نقطو مهيا ڪري ٿو.

بهرحال، هن نموني ۾ نقص آهن:
  1. سنگلٽن واحد ذميواري اصول جي ڀڃڪڙي ڪري ٿو: ان جي سڌي فرضن کان علاوه، سنگلٽن ڪلاس پڻ مثالن جي تعداد کي سنڀاليندو آهي.

  2. هڪ عام طبقي جو سنگلٽن تي انحصار طبقي جي عوامي معاهدي ۾ نظر نٿو اچي.

  3. گلوبل variables خراب آهن. بالآخر، هڪ سنگل هڪ وڏي عالمي متغير ۾ بدلجي ٿو.

  4. سنگلٽن جي موجودگي مجموعي طور تي ايپليڪيشن جي قابليت کي گھٽائي ٿي ۽ طبقن جيڪي خاص طور تي سنگلٽن کي استعمال ڪن ٿا.

۽ اهو ئي آهي! :) اسان توهان سان گڏ جاوا سنگلٽن ڪلاس جي ڳولا ڪئي آهي. ھاڻي، توھان جي باقي زندگيءَ لاءِ، جڏھن توھان پنھنجي پروگرامر دوستن سان ڳالھائي رھيا آھيو، توھان نه رڳو ذڪر ڪري سگھوٿا ته نمونو ڪيترو سٺو آھي، پر ڪجھ لفظن جي باري ۾ پڻ ٻڌايان ٿو ته اھو خراب آھي. سٺي قسمت هن نئين علم ۾ ماهر.

اضافي پڙهڻ:

تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION