JavaRush /جاوا بلاگ /Random-SD /ڊيزائن جا نمونا: سنگلٽن

ڊيزائن جا نمونا: سنگلٽن

گروپ ۾ شايع ٿيل
سلام! اڄ اسين مختلف ڊيزائن جي نمونن تي هڪ ويجھو نظر وجهنداسين، ۽ اسان سنگلٽن جي نموني سان شروع ڪنداسين، جنهن کي ”سنگلٽن“ به سڏيو وڃي ٿو. ڊيزائن جا نمونا: سنگلٽن - 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 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هم وقت سازي آهي، ۽ توهان ان کي صرف هڪ وقت ۾ داخل ڪري سگهو ٿا. حقيقت ۾، اسان کي پوري طريقي سان هم وقت سازي ڪرڻ جي ضرورت ناهي، پر ان جو صرف اهو حصو جنهن ۾ اسان هڪ نئين طبقي اعتراض کي شروع ڪريون ٿا. پر اسان صرف ان حصي کي لپي نٿا سگھون جيڪو synchronizedبلاڪ ۾ نئين شئي ٺاهڻ لاءِ ذميوار آهي: هي ٿريڊ جي حفاظت فراهم نه ڪندو. اهو ٿورو وڌيڪ پيچيده آهي. صحيح هم وقت سازي جو طريقو هيٺ ڏنل آهي:

ڊبل چيڪ ٿيل تالا

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

  • تار جي حفاظت

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

مائنس:
  • 1.5 کان گھٽ جاوا ورزن تي سپورٽ نه ڪئي وئي (وولٽائل ڪي ورڊ ورزن 1.5 ۾ مقرر ڪيو ويو)

مان نوٽ ڪريان ٿو ته ھن عمل درآمد جي اختيار لاءِ صحيح ڪم ڪرڻ لاءِ، ٻن شرطن مان ھڪڙي گھربل آھي. متغير INSTANCEيا ته هجڻ گهرجي final، يا volatile. آخري عمل جنهن تي اسين اڄ بحث ڪنداسين Class Holder 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;
   }
}
فائدا:
  • سست شروعات.

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

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

مائنس:
  • صحيح آپريشن لاءِ، ان ڳالهه جي ضمانت ڏيڻ ضروري آهي ته ڪلاس جي اعتراض کي Singletonبغير غلطين جي شروعات ڪئي وئي آهي. ٻي صورت ۾، پهريون طريقو ڪال getInstanceهڪ غلطي ۾ ختم ٿي ويندو ExceptionInInitializerError، ۽ سڀ بعد وارا ناڪام ٿي ويندا NoClassDefFoundError.

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

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

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

  2. ھن ڪلاس جي ھڪڙي مثال کي عالمي رسائي پوائنٽ مهيا ڪري ٿي.

بهرحال، هن نموني جا نقصان آهن:
  1. سنگلٽن SRP جي خلاف ورزي ڪري ٿو (اڪيلو ذميواري اصول) - سنگلٽن ڪلاس، پنهنجي فوري ذميوارين کان علاوه، ان جي ڪاپين جي تعداد کي پڻ ڪنٽرول ڪري ٿو.

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

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

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

ٺيڪ آهي هاڻي سڀ ختم ٿي چڪو آهي. اسان سنگلٽن جي ڊيزائن جي نموني کي ڏٺو. هاڻي، توهان جي پروگرامر دوستن سان زندگي جي گفتگو ۾، توهان نه رڳو اهو چئي سگهندا ته ان بابت ڇا سٺو آهي، پر ان بابت ڪجهه لفظ پڻ ان بابت خراب آهي. نئين علم حاصل ڪرڻ ۾ سٺي قسمت.

اضافي پڙهڻ:

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