সুইফটে একটি প্রেরণ_আনসেস সিঙ্গলটন মডেল ব্যবহার করে


575

আমি সুইফটে ব্যবহারের জন্য উপযুক্ত সিঙ্গলটন মডেলটি নিয়ে কাজ করার চেষ্টা করছি। এখনও অবধি, আমি একটি নন-থ্রেড নিরাপদ মডেল হিসাবে কাজ করতে সক্ষম হয়েছি:

class var sharedInstance: TPScopeManager {
    get {
        struct Static {
            static var instance: TPScopeManager? = nil
        }

        if !Static.instance {
            Static.instance = TPScopeManager()
        }

        return Static.instance!
    }
}

স্ট্যাটিক স্ট্রাক্টে সিঙ্গেলটন দৃষ্টান্তটি মোছার ক্ষেত্রে এমন একক উদাহরণের অনুমতি দেওয়া উচিত যা জটিল নামকরণের স্কিমিং ছাড়াই সিঙ্গেলটন দৃষ্টান্তের সাথে সংঘর্ষে না আসে এবং এটি জিনিসগুলি মোটামুটি ব্যক্তিগত করে তোলে। স্পষ্টতই যদিও, এই মডেলটি থ্রেড-নিরাপদ নয়। তাই আমি dispatch_onceপুরো জিনিসটিতে যুক্ত করার চেষ্টা করেছি :

class var sharedInstance: TPScopeManager {
    get {
        struct Static {
            static var instance: TPScopeManager? = nil
            static var token: dispatch_once_t = 0
        }

        dispatch_once(Static.token) { Static.instance = TPScopeManager() }

        return Static.instance!
    }
}

তবে আমি dispatch_onceলাইনে একটি সংকলক ত্রুটি পেয়েছি :

এক্সপ্রেশন এর টাইপ 'শূন্য' টাইপ '()' তে রূপান্তর করতে পারবেন না

আমি সিনট্যাক্সের বিভিন্ন বিভিন্ন প্রকার চেষ্টা করেছি, তবে তাদের সবার একই ফলাফল বলে মনে হচ্ছে:

dispatch_once(Static.token, { Static.instance = TPScopeManager() })

dispatch_onceসুইফট ব্যবহারের সঠিক ব্যবহার কী ? আমি প্রাথমিকভাবে ভেবেছিলাম ()ত্রুটি বার্তায় থাকার কারণে সমস্যাটি ব্লকের সাথে রয়েছে , তবে আমি যত বেশি এটি দেখব ততই আমি মনে করি এটি dispatch_once_tসঠিকভাবে সংজ্ঞায়িত হওয়ার বিষয় হতে পারে ।


3
আমি সেই সমস্ত স্থিতিশীল কোডটি সরিয়ে ফেলব এবং @ লেজি ইনিশিয়ালাইজারের সাহায্যে কেবলমাত্র পঠন সম্পত্তি ব্যবহার করব।
সুলতান

1
যে আমি বোঝানো কি. দুর্ভাগ্যক্রমে আমাদের কাছে এখনও ইন্টার্নাল সম্পর্কে পর্যাপ্ত তথ্য নেই। তবে আইএমএইচওর যে কোনও বাস্তবায়ন @lazyথ্রেড নিরাপদ হওয়া উচিত।
সুলতান

1
এবং এই উপায়ে কলারদের পূর্বাভাসের সাথে বাস্তবায়নটি প্রকাশ না করার সুবিধাও রয়েছে।
ডেভিড বেরি

1
আপনার কাছে অলস ক্লাস ভেরিয়েবল থাকতে পারে বলেও মনে হয় না।
ডেভিড বেরি

সাবধান হও! এই পদ্ধতির সাথে দুটি বিষয় লক্ষণীয়। প্রথমত, এর থেকে উত্তরাধিকারসূত্রে যে কোনও শ্রেণি ভাগ করা ইনস্ট্যান্স সম্পত্তি ওভাররাইড করতে হবে। Static.instance = TPScopeManager()উদাহরণ টাইপ জোর করে। যদি আপনি Static.instance = self()প্রয়োজনীয় প্রাথমিকের সাথে কিছু ব্যবহার করেন তবে উপযুক্ত ধরণের শ্রেণি তৈরি করা হবে। তবুও, এবং এই গুরুত্বপূর্ণ বিষয়টি লক্ষ্য করা যায়, শ্রেণিবদ্ধের সমস্ত দৃষ্টান্তের জন্য কেবল একবার! আরম্ভ করার জন্য প্রথম টাইপ হ'ল সমস্ত দৃষ্টান্তের জন্য টাইপ সেট। আমি মনে করি না উদ্দেশ্য-সি একই আচরণ করেছে ved
শান উডওয়ার্ড

উত্তর:


713

tl; dr: আপনি যদি পূর্ববর্তী সংস্করণগুলি সমর্থন করতে চান তবে আপনি সুইফট ১.২ বা তার বেশি বা তার উপরে নেস্টেট স্ট্রাক পদ্ধতির ব্যবহার করছেন যদি শ্রেণির ধ্রুবক পদ্ধতির ব্যবহার করুন ।

সুইফ্টের সাথে আমার অভিজ্ঞতা থেকে সিঙ্গেলটন প্যাটার্নটি প্রয়োগ করতে তিনটি পন্থা রয়েছে যা অলস সূচনা এবং থ্রেড সুরক্ষাকে সমর্থন করে।

ক্লাস ধ্রুবক

class Singleton  {
   static let sharedInstance = Singleton()
}

এই পদ্ধতির অলস সূচনাটি সমর্থন করে কারণ সুইফ্ট অলসভাবে শ্রেণীর ধ্রুবকগুলি (এবং ভেরিয়েবলগুলি) আরম্ভ করে এবং এর সংজ্ঞা অনুসারে থ্রেড নিরাপদ let। এটি এখন একটি সিঙ্গলটন ইনস্ট্যান্ট করার আনুষ্ঠানিকভাবে প্রস্তাবিত উপায়

ক্লাস ধ্রুবকগুলি সুইফট ১.২ এ প্রবর্তিত হয়েছিল। আপনার যদি সুইফ্টের পূর্ববর্তী সংস্করণটি সমর্থন করার দরকার হয় তবে নীচের নেস্টেড স্ট্রাক পদ্ধতির বা কোনও বিশ্ব ধ্রুবক ব্যবহার করুন।

নেস্টেড স্ট্রাক্ট

class Singleton {
    class var sharedInstance: Singleton {
        struct Static {
            static let instance: Singleton = Singleton()
        }
        return Static.instance
    }
}

এখানে আমরা শ্রেণি ধ্রুবক হিসাবে নেস্টেড স্ট্রাক্টের স্থিতিশীল ধ্রুবকটি ব্যবহার করছি। এটি সুইফট ১.১ এবং এর আগের স্ট্যাটিক শ্রেণির ধ্রুবকের অভাবের জন্য কাজ এবং এটি এখনও কার্যকরী স্থিতিশীল ধ্রুবক এবং ভেরিয়েবলের অভাবের জন্য কাজ হিসাবে কাজ করে।

dispatch_once

Theতিহ্যবাহী উদ্দেশ্য-সি পদ্ধতির সুইফটে পোর্ট করা হয়েছে। আমি মোটামুটিভাবে নিশ্চিত যে নেস্টেড স্ট্রাক পদ্ধতির চেয়ে কোনও লাভ নেই তবে বাক্য সংশ্লেষের পার্থক্যগুলি আকর্ষণীয় মনে হওয়ায় আমি এটি এখানে রাখছি putting

class Singleton {
    class var sharedInstance: Singleton {
        struct Static {
            static var onceToken: dispatch_once_t = 0
            static var instance: Singleton? = nil
        }
        dispatch_once(&Static.onceToken) {
            Static.instance = Singleton()
        }
        return Static.instance!
    }
}

ইউনিট পরীক্ষার জন্য এই গিটহাব প্রকল্পটি দেখুন ।


13
"থ্রেড সেফ অফ সেফ" - এটি কি কোথাও বলা হয়েছে? ডকুমেন্টেশনে আমি এর উল্লেখ খুঁজে পাই না।
jtbandes

4
@ জজব্যান্ডেস কনস্ট্যান্টরা আমার জানা সমস্ত ভাষায় থ্রেড নিরাপদ।
এইচপিক

2
@ ডেভুড আমি ধরে নিয়েছি আপনি শেষ পদ্ধতির কথা বলছেন। আমি নিজেকে উদ্ধৃত করব: "আমি বলব এখন আর এই পদ্ধতির ব্যবহারের দরকার নেই তবে বাক্যবিন্যাসের পার্থক্যগুলি আকর্ষণীয় মনে হওয়ায় আমি এটিকে এখানে রাখছি putting"
এইচপিক

5
করা উচিত initএছাড়াও ঘোষিত করা privateগ্যারান্টি এক এবং বস্তুর মাত্র এক উদাহরণ হিসেবে বলা যায় কি কখনো অ্যাপ্লিকেশনের জীবনকাল সর্বত্র বিদ্যমান থাকবে?
অ্যান্ড্রু

5
"ক্লাস ধ্রুবক" পদ্ধতির মধ্যে, আমি প্রস্তাব দিয়েছি (ক) ক্লাসটি এমন ঘোষণা করে finalযাতে আপনি এটি সাবক্লাস করেন না; এবং (খ) initপদ্ধতিটিকে privateএমনভাবে ঘোষনা করা যাতে আপনি দুর্ঘটনাক্রমে অন্য কোথাও কোথাও ইনস্ট্যান্ট না করতে পারেন।
রব

175

যেহেতু অ্যাপল এখন স্পষ্ট করে দিয়েছে যে স্ট্যাটিক স্ট্রাক্ট ভেরিয়েবলগুলি অলস এবং জড়িত উভয়ই সূচনা করা হয়েছে dispatch_once(পোস্টের শেষে নোটটি দেখুন), আমার মনে হয় আমার চূড়ান্ত সমাধানটি হতে চলেছে:

class WithSingleton {
    class var sharedInstance: WithSingleton {
        struct Singleton {
            static let instance = WithSingleton()
        }

        return Singleton.instance
    }
}

এটি স্ট্যাটিক স্ট্রাক্ট উপাদানগুলির স্বয়ংক্রিয় অলস, থ্রেড-নিরাপদ আরম্ভের সুবিধা গ্রহণ করে, গ্রাহকের কাছ থেকে প্রকৃত বাস্তবায়ন নিরাপদে লুকিয়ে রাখে, সবকিছুকে সুসংগঠনের জন্য সুসংগঠিতভাবে রাখে এবং দৃশ্যমান গ্লোবাল ভেরিয়েবলকে সরিয়ে দেয়।

অ্যাপল স্পষ্ট করে দিয়েছে যে অলস সূচনাটি থ্রেড-নিরাপদ, সুতরাং এর প্রয়োজন dispatch_onceবা অনুরূপ সুরক্ষা দেওয়ার দরকার নেই

গ্লোবাল ভেরিয়েবলের জন্য অলস ইনিশিয়ালাইজার (স্ট্রাক্ট এবং এনামগুলির স্থিতিশীল সদস্যদের জন্যও) প্রথমবার চালিত হয় যে গ্লোবাল অ্যাক্সেস করা হয় এবং প্রারম্ভিকটি পারমাণবিক কিনা তা নিশ্চিত করার জন্য ডিসপ্যাচ_অনস হিসাবে চালু করা হয়। এটি আপনার কোডে ডিসপ্যাচ_অনস ব্যবহারের দুর্দান্ত উপায়টিকে সক্ষম করে: কেবলমাত্র একটি ইনিশিয়ালাইজারের মাধ্যমে একটি বৈশ্বিক পরিবর্তনশীল ঘোষণা করুন এবং এটিকে ব্যক্তিগত চিহ্নিত করুন।

থেকে এখানে


1
নিশ্চিত করার জন্য: গ্লোবাল ভেরিয়েবলের অলস, থ্রেড-নিরাপদ সূচনা রয়েছে, তবে শ্রেণি ভেরিয়েবলগুলি তা করে না। রাইট?
বিল

14
আমি যুক্ত করব যে একটি ভাল অনুশীলন private init() {}হ'ল প্রারম্ভিকটিকে বেসরকারী হিসাবে ঘোষণা করা: আরও এই সত্যটি প্রয়োগ করা যে এই শ্রেণিটি বাহ্যিকভাবে তাত্ক্ষণিকভাবে বোঝানো হয়নি।
পাস্কেল বার্ক

1
সুতরাং স্ট্যাটিক স্ট্রাক var ইনিশিয়ালাইজেশন অলস এবং থ্রেড নিরাপদ, যদি সেই স্ট্যাটিক স্ট্রাক ভার্ট মাল্টিটনের জন্য একটি অভিধান হয় তবে আমাদের প্রতিটি অ্যাক্সেসের জন্য এটিতে ম্যানুয়ালি সিঙ্ক্রোনাইজ / কাতারে কল করতে হবে, তাই না?

যদি আমি আপনার প্রশ্নটি সঠিকভাবে বুঝতে পারি তবে অভিধান এবং অ্যারে অ্যাক্সেসগুলি সহজাতভাবে থ্রেড-নিরাপদ নয়, তাই আপনাকে থ্রেড সিঙ্ক্রোনাইজেশনের কিছু ফর্ম ব্যবহার করতে হবে।
ডেভিড বেরি

@ ডেভিডবেরি এই সিঙ্গলটন ক্লাসের ভিতরে আমাকে কোনও ফাংশন কীভাবে কল করা উচিত? আমার ক্লাস.শ্রেডইনস্ট্যান্সের প্রথম কলটিতে কল করার জন্য আমার একটি ফাংশন দরকার।
অমিত ধস

163

সুইফট 1.2 এবং এর বাইরে:

class Singleton  {
   static let sharedInstance = Singleton()
}

যথার্থতার প্রমাণ সহ (সমস্ত ক্রেডিট এখানে যায় ), সিলেটলেটের জন্য পূর্ববর্তী কোনও পদ্ধতি ব্যবহার করার এখন আর কোনও কারণ নেই।

আপডেট : সরকারী দস্তাবেজে বর্ণিত সিংলেটনের সংজ্ঞা দেওয়ার এটি এখন সরকারী উপায় !

staticবনাম ব্যবহার নিয়ে উদ্বেগের বিষয়টি class। ভেরিয়েবলগুলি উপলভ্য হয়ে staticগেলেও ব্যবহার করা উচিত class। সিঙ্গলটনের অর্থ সাবক্ল্যাস করা নয়, কারণ এর ফলে বেস সিঙ্গলটনের একাধিক ঘটনা ঘটবে। staticএটিকে একটি সুন্দর, তীক্ষ্ণ উপায়ে প্রয়োগ করে ।

সুইফ্ট 1.0 এবং 1.1 এর জন্য:

সুইফটের সাম্প্রতিক পরিবর্তনগুলি, বেশিরভাগই নতুন অ্যাক্সেস নিয়ন্ত্রণের পদ্ধতিগুলির সাথে, আমি এখন সিঙ্গেলনের জন্য বিশ্বব্যাপী পরিবর্তনশীল ব্যবহারের ক্লিনারের দিকে ঝুঁকছি।

private let _singletonInstance = SingletonClass()
class SingletonClass {
  class var sharedInstance: SingletonClass {
    return _singletonInstance
  }
}

এখানে সুইফ্ট ব্লগ নিবন্ধে উল্লিখিত হিসাবে :

গ্লোবাল ভেরিয়েবলের জন্য অলস ইনিশিয়ালাইজার (স্ট্রাক্ট এবং এনামগুলির স্থিতিশীল সদস্যদের জন্যও) প্রথমবার চালিত হয় যে গ্লোবাল অ্যাক্সেস করা হয় এবং প্রারম্ভিকটি পারমাণবিক কিনা তা নিশ্চিত করার জন্য ডিসপ্যাচ_অনস হিসাবে চালু করা হয়। এটি আপনার কোডে ডিসপ্যাচ_অনস ব্যবহারের দুর্দান্ত উপায়টিকে সক্ষম করে: কেবলমাত্র একটি ইনিশিয়ালাইজারের মাধ্যমে একটি বৈশ্বিক পরিবর্তনশীল ঘোষণা করুন এবং এটিকে ব্যক্তিগত চিহ্নিত করুন।

সিঙ্গেলটন তৈরির এই উপায়টি থ্রেড নিরাপদ, দ্রুত, অলস এবং বিনামূল্যে ওজেজেসি তে ব্রিজ করা হয়।


2
যে কেউ কেবল এই উত্তরটি পড়ছেন: টোকেনকে স্থির করতে ভুলবেন না, অন্যথায় আচরণটি সংজ্ঞায়িত। সম্পূর্ণ কোডের জন্য ডেভিড সম্পাদিত প্রশ্ন দেখুন।
nschum

@ আনছাম অন্যথায়, আচরণটি সংজ্ঞায়িত নয়, এটি কেবল একটি সু-সংজ্ঞায়িত উপায়ে বিভক্ত: এই ব্লকটি সর্বদা কার্যকর হবে।
মাইকেল

@ মিশেল: ডকুমেন্টেশন এটিকে সংজ্ঞায়িত বলে উল্লেখ করেছে। বর্তমান আচরণ তাই কাকতালীয়।
এনএসকম

1
এটি বলার মতো একটি অদ্ভুত বিষয়। ডকুমেন্টেশন যদি এটিকে "অপরিজ্ঞাত" বলে ডাকে তবে এর অর্থ হ'ল যে কেউ কোড লিখেছেন সে এটির সাথে কোনও প্রতিশ্রুতি দেয় না। ভেরিয়েবল স্থিতিশীল কিনা তা জেনেও কোডের সাথে এর কোনও যোগসূত্র নেই। এটির অর্থ হ'ল বর্তমান (বা স্পষ্ট) আচরণের উপর নির্ভর করা যায় না।
এনএসকম

6
আপনি এর private init() {}আরম্ভকারী হিসাবে যোগ করতে চাইতে পারেন SingletonClass। বাইরে থেকে তাত্ক্ষণিক প্রতিরোধ করতে।
rintaro

46

সুইফট ১.২ বা তারপরে ক্লাসে স্ট্যাটিক ভেরিয়েবল / ধ্রুবক সমর্থন করে। সুতরাং আপনি কেবল একটি স্থির ধ্রুবক ব্যবহার করতে পারেন:

class MySingleton {

    static let sharedMySingleton = MySingleton()

    private init() {
        // ...
    }
}

35

এটি করার আরও ভাল উপায় আছে। আপনি এই শ্রেণীর ঘোষণার উপরে আপনার ক্লাসে একটি বৈশ্বিক পরিবর্তনশীল ঘোষণা করতে পারেন:

var tpScopeManagerSharedInstance = TPScopeManager()

এটি কেবল আপনার ডিফল্ট টিমকে বা যেকোনো আরম্ভ এবং বিশ্বব্যাপী ভেরিয়েবলগুলি সুইফটে ডিফল্টরূপে কল dispatch_onceকরে। তারপরে যে কোনও শ্রেণিতে আপনি একটি রেফারেন্স পেতে চান, আপনি কেবল এটি করুন:

var refrence = tpScopeManagerSharedInstance
// or you can just access properties and call methods directly
tpScopeManagerSharedInstance.someMethod()

সুতরাং মূলত আপনি ভাগ করা উদাহরণ কোডের সম্পূর্ণ ব্লক থেকে মুক্তি পেতে পারেন।


3
কেন একটি "ভার" এবং প্রচুর একটি "লেট"?
স্টিফান

1
সম্ভবত একটি লেট হতে পারে, আমি কেবল এটি একটি ভেরি দিয়ে পরীক্ষা করেছি।
ক্রিস জেলসি

আমি এই উত্তরটি পছন্দ করি তবে আমার ইন্টারফেস বিল্ডারের কাছ থেকে এটি (সিঙ্গলটন) অ্যাক্সেস করা দরকার। আইবি থেকে এই টিপসকোপ ম্যানেজার শেয়ারডইনস্ট্যান্সটি কীভাবে অ্যাক্সেস করতে পারি সে সম্পর্কে কোনও ধারণা ?. ধন্যবাদ .-
লুইস প্যালাসিওস

এটি একটি সিঙ্গলটন থাকার আমার পছন্দের উপায়। এটিতে সমস্ত স্বাভাবিক বৈশিষ্ট্য রয়েছে (থ্রেড-সুরক্ষা এবং অলস তাত্পর্য) এবং এটি খুব লাইটওয়েট সিনট্যাক্সকে সমর্থন করে: TPScopeManager.sharedInstance.doIt()সব সময় লেখার দরকার নেই , কেবল আপনার শ্রেণির নাম রাখুন TPScopeManagerClass, ক্লাসের পাশে এই ঘোষণা থাকবেন public let TPScopeManager = TPScopeManagerClass()এবং যখন কেবল লিখুন TPScopeManager.doIt()। খুব পরিষ্কার!
অ্যালেক্স

অতিরিক্ত উদাহরণগুলির সৃষ্টি প্রতিরোধ করার জন্য এখানে কিছুই নেই TPScopeManagerএবং তাই এটি সিঙ্গলটন নয় সংজ্ঞা অনুসারে ।
কালেব

28

সুইফট singletons বর্গ ফাংশন, যেমন যেমন কোকো অবকাঠামো মধ্যে উন্মুক্ত NSFileManager.defaultManager(), NSNotificationCenter.defaultCenter()। সুতরাং এই আচরণটি মিরর করার জন্য এটি বর্গ ফাংশন হিসাবে আরও কিছু বোঝায়, বরং কিছু অন্যান্য সমাধান হিসাবে ক্লাস ভেরিয়েবল। উদাহরণ:

class MyClass {

    private static let _sharedInstance = MyClass()

    class func sharedInstance() -> MyClass {
        return _sharedInstance
    }
}

এর মাধ্যমে সিঙ্গলটন পুনরুদ্ধার করুন MyClass.sharedInstance()


1
শৈলীর জন্যও শিখুন কোকোস 2 ডি :) -র মন্তব্যের জন্য আপভোটড।
x4h1d

2
ক্লাসের অভ্যন্তরে স্ট্যাটিকের মাধ্যমে গ্লোবাল ভেরিয়েবলকে ক্লাস ভেরিয়েবলে পরিবর্তন করা উচিত।
ম্যালহাল

2
@ মমাল যখন কোনও ভেরিয়েবলটি ব্যক্তিগত হিসাবে চিহ্নিত করা হয় তবে শ্রেণীর বাইরে থাকে তবে এটি বৈশ্বিক নয় - তবে কেবল এটির মধ্যে থাকা ফাইলে স্কোপ করা থাকে class শ্রেণীর অভ্যন্তরীণ স্থিতিশীলটি একইভাবে কাজ করবে তবে আমি স্থির ব্যবহারের উত্তরটি আপডেট করেছি যেমনটি আপনি প্রস্তাব করেছিলেন, আপনি যদি ফাইলের মধ্যে একাধিক ক্লাস ব্যবহার করতে চান তবে এটি ক্লাসে পরিবর্তনশীলকে আরও ভাল করে দেয়।
রায়ান

1
"সুইফট সিঙ্গলেটনগুলি কোকো ফ্রেমওয়ার্কগুলিকে শ্রেণীর ফাংশন হিসাবে প্রকাশ করা হয়" ... সুইফ্ট 3 এ নয়। এগুলি এখন সাধারণত staticসম্পত্তি properties
রব

17

প্রতি অ্যাপল ডকুমেন্টেশন , এটা অনেক বার যে সুইফট এই কাজটি করার সবচেয়ে সহজ উপায় একটি স্ট্যাটিক টাইপ সম্পত্তি সঙ্গে পুনরাবৃত্তি করা হয়েছে:

class Singleton {
    static let sharedInstance = Singleton()
}

তবে, আপনি যদি সাধারণ কন্সট্রাক্টর কলের বাইরে অতিরিক্ত সেটআপ করার কোনও উপায় সন্ধান করেন, তবে তাৎক্ষণিকভাবে অনুরোধ করা বন্ধটি হ'ল গোপনীয়তা:

class Singleton {
    static let sharedInstance: Singleton = {
        let instance = Singleton()
        // setup code
        return instance
    }()
}

এটি একবারে থ্রেড-নিরাপদ এবং অলসভাবে শুরু করার গ্যারান্টিযুক্ত।


আপনি কীভাবে স্থির যাক উদাহরণটি শূন্য করতে পারেন?
gpichler

1
@ ব্যবহারকারী 1463853 - আপনি পারবেন না, এবং সাধারণত করা উচিত নয়।
রব

16

সুইফট 4+

protocol Singleton: class {
    static var sharedInstance: Self { get }
}

final class Kraken: Singleton {
    static let sharedInstance = Kraken()
    private init() {}
}

2
এটি চূড়ান্ত শ্রেণির দরকার, আপনি আরও পার্থক্যটি ব্যাখ্যা করতে পারেন, আমি স্ট্রাক্ট সহ সিঙ্গলটনের অন্যান্য সমাধান নিয়ে ইস্যু করেছি
রহিল সাদিক

এটি কি ব্যক্তিগত ওভাররাইড
থ্রি

8

অ্যাপলের স্যাম্পল কোডটি দেখে আমি এই প্যাটার্নটি পেরিয়ে এসেছি। আমি নিশ্চিত নই যে সুইফট স্ট্যাটিক্সের সাথে কীভাবে কাজ করে তবে এটি থ্রেডে সি # তে নিরাপদ হবে। আমি উদ্দেশ্য এবং সি ইন্টারপ জন্য সম্পত্তি এবং পদ্ধতি উভয় অন্তর্ভুক্ত।

struct StaticRank {
    static let shared = RankMapping()
}

class func sharedInstance() -> RankMapping {
    return StaticRank.shared
}

class var shared:RankMapping {
    return StaticRank.shared
}

আমি নিশ্চিত যে এই ডিফল্ট স্ট্যাটিক সিনট্যাক্সটি ব্যবহার করলে সমস্ত বিরক্তিকর কাজ হবে।
ইওনিল

দুর্ভাগ্যক্রমে স্ট্যাটিকস কেবল স্ট্রাক্টের অভ্যন্তরে কাজ করে, তাই এই প্যাটার্নটি।
ব্যবহারকারী 2485100

আমার উদ্দেশ্য ছিল আমাদের dispatch_onceস্টাফ ব্যবহার করতে হবে না । আমি তোমার স্টাইলে বাজি দিচ্ছি। :)
Eonil

নন classসমতুল্য একটি বর্গ ঘোষণা মধ্যে staticএকটি struct ঘোষণায়?
রাসেল বোরোগোভ

@ সাম এটি হ্যাঁ ফাইল এবং ইনিশিয়ালাইজেশনে অ্যাপল ব্লগ এন্ট্রি দেখুন যা এটি স্পষ্ট করে দেয় যে গ্লোবাল এবং স্ট্রাইক এবং এনামগুলির স্থিতিশীল সদস্য উভয়ই এই dispatch_onceক্ষমতা থেকে উপকৃত হন ।
রব

5

সংক্ষেপে,

class Manager {
    static let sharedInstance = Manager()
    private init() {}
}

আপনি ফাইল এবং সূচনা পড়তে চাইতে পারেন

গ্লোবাল ভেরিয়েবলের জন্য অলস ইনিশিয়ালাইজার (স্ট্রাক্টস এবং এনামগুলির স্থিতিশীল সদস্যদের জন্যও) প্রথমবারের মতো বিশ্বব্যাপী অ্যাক্সেস করা হয় এবং dispatch_onceএটি সূচনা হয় যে এটি পারমাণবিক কিনা তা নিশ্চিত করার জন্য চালু করা হয়।


4

আপনি যদি ওজেক্টিভ-সিতে আপনার সুইফট সিঙ্গলটন ক্লাসটি ব্যবহার করার পরিকল্পনা করছেন, এই সেটআপটিতে সংকলকটি উপযুক্ত উদ্দেশ্য-সি-এর মতো শিরোনাম উত্পন্ন করবে:

class func sharedStore() -> ImageStore {
struct Static {
    static let instance : ImageStore = ImageStore()
    }
    return Static.instance
}

তারপরে অবজেক্টিভ-সি শ্রেণিতে আপনি আপনার সিঙ্গেলটনকে প্রাক-সুইফ্টের দিনগুলিতে যেভাবে করেছিলেন তা কল করতে পারেন:

[ImageStore sharedStore];

এটি কেবল আমার সাধারণ বাস্তবায়ন।


এটি অন্যান্য উদাহরণের তুলনায় আরও সংক্ষিপ্ত এবং সঠিক কারণ এটি অন্যান্য সুইফট সিঙ্গলটনের মতো একইভাবে প্রয়োগ করা হয়েছে। উদাহরণস্বরূপ: শ্রেণীর কাজগুলি যেমন পছন্দ করে NSFileManager.defaultManager()তবে তবুও সুইফটের অলস থ্রেড-নিরাপদ স্থিতিশীল সদস্য পদ্ধতি ব্যবহার করে।
লেসেলি গডউইন

কোকো সাধারণত স্ট্যাটিক বৈশিষ্ট্য হিসাবে আজকাল প্রয়োগ করে, শ্রেণিবদ্ধ হিসাবে নয়।
রব

আমি এটি সম্পর্কে সচেতন, আমার মন্তব্যটি 2 বছরের বেশি পুরানো। উল্লেখ করার জন্য ধন্যবাদ।
মাইকেল

4

প্রথম সমাধান

let SocketManager = SocketManagerSingleton();

class SocketManagerSingleton {

}

আপনার কোড পরে:

func someFunction() {        
    var socketManager = SocketManager        
}

দ্বিতীয় সমাধান

func SocketManager() -> SocketManagerSingleton {
    return _SocketManager
}
let _SocketManager = SocketManagerSingleton();

class SocketManagerSingleton {

}

এবং পরে আপনার কোডে আপনি কম বিভ্রান্তির জন্য ধনুর্বন্ধনী রাখতে সক্ষম হবেন:

func someFunction() {        
    var socketManager = SocketManager()        
}

4
final class MySingleton {
     private init() {}
     static let shared = MySingleton()
}

তারপরে ফোন করুন;

let shared = MySingleton.shared

কেবল initহিসাবে চিহ্নিত করার জন্যই নয় private, পাশাপাশি তৈরি করার sharedMyModelজন্যও দুর্দান্ত final! ভবিষ্যতের পাঠকদের স্বার্থে, সুইফ্ট 3-এ, আমরা sharedMyModelকেবল নামকরণ সরল হতে ঝুঁকতে পারি shared
রব

এটিই একমাত্র সঠিক উত্তর, ব্যতীত সুপাররেইনে ওভাররাইড এবং কলটি ভুল এবং সংকলনও করবে না।
মাইকেল মরিস

4

ব্যবহার করুন:

class UtilSingleton: NSObject {

    var iVal: Int = 0

    class var shareInstance: UtilSingleton {
        get {
            struct Static {
                static var instance: UtilSingleton? = nil
                static var token: dispatch_once_t = 0
            }
            dispatch_once(&Static.token, {
                Static.instance = UtilSingleton()
            })
            return Static.instance!
        }
    }
}

ব্যবহারবিধি:

UtilSingleton.shareInstance.iVal++
println("singleton new iVal = \(UtilSingleton.shareInstance.iVal)")

এটি এখনকার উত্তরের পথে আমি যে উত্তর দিয়েছি তার মধ্যে একটির মতোই। যেহেতু গ্লোবাল ভেরিয়েবলগুলি অলস এবং থ্রেড-নিরাপদ উভয়ই সূচনা করা হয়েছে, অতিরিক্ত জটিলতার কোনও কারণ নেই।
ডেভিড বেরি

@ ডেভিড গ্লোবাল ভেরিয়েবল না থাকলে অন্য। :)
এইচপিক

@hpique না, ঠিক আমার আগের প্রচেষ্টাগুলির মতো। সম্পাদনার ইতিহাস দেখুন।
ডেভিড বেরি

4

১.২ এর উপরে সুইফ্টের সর্বোত্তম পন্থাটি হ'ল এক-লাইন সিঙ্গলটন, যেমন -

class Shared: NSObject {

    static let sharedInstance = Shared()

    private override init() { }
}

এই পদ্ধতির আরও বিশদ জানতে আপনি এই লিঙ্কটি দেখতে পারেন ।


কেন একটি NSObjectসাবক্লাস ?. এগুলি ছাড়াও এটি মূলত স্ট্যাকওভারফ্লো . com/a/28436202/1187415 এর মতো বলে মনে হচ্ছে ।
মার্টিন আর

3

অ্যাপল ডক্স থেকে (সুইফ্ট 3.0.1),

আপনি কেবল স্ট্যাটিক ধরণের সম্পত্তি ব্যবহার করতে পারেন, যা একবারে একসাথে একাধিক থ্রেডে অ্যাক্সেস করা সত্ত্বেও অলসভাবে কেবল একবার শুরু করার গ্যারান্টিযুক্ত:

class Singleton {
    static let sharedInstance = Singleton()
}

আপনার যদি আরম্ভের বাইরে অতিরিক্ত সেটআপ করার প্রয়োজন হয় তবে আপনি বিশ্বব্যাপী ধ্রুবকে বন্ধের অনুরোধের ফলাফলটি অর্পণ করতে পারেন:

class Singleton {
    static let sharedInstance: Singleton = {
        let instance = Singleton()
        // setup code
        return instance
    }()
}

3

আমি enumজাভাতে যেমন ব্যবহার করব তেমন একটি পরামর্শ দেব

enum SharedTPScopeManager: TPScopeManager {
    case Singleton
}

আইএমও, এটি সিঙ্গেলটন বাস্তবায়নের একমাত্র সঠিক সুইফট উপায়। অন্যান্য উত্তরগুলি হ'ল ওবিজেসি / সি / সি ++ উপায়
ব্রায়ান চেন

আপনি কি এই উত্তরটি বিস্তারিত বলতে পারবেন? সিঙ্গেলটন কোথায় এই স্নিপেট থেকে ইনস্ট্যান্ট হয় তা আমার কাছে পরিষ্কার নয়
কেনি উইঙ্কার

@ কেনি উইঙ্কার আমার কাছে কোনও অ্যাপল বিকাশকারী লগইন নেই, অতএব কোনও দ্রুতগতি নেই এবং আর যখন প্রাথমিককরণটি হয় তখন আমি উত্তর দিতে পারি না। জাভাতে, এটি প্রথম ব্যবহারে রয়েছে। সম্ভবত আপনি এটি প্রারম্ভিককরণের একটি মুদ্রণ দিয়ে চেষ্টা করে দেখতে পারেন এবং প্রিন্টটি প্রবর্তনকালে বা অ্যাক্সেসের পরে ঘটে কিনা। এটি কম্পাইলার দ্বারা এনাম কীভাবে প্রয়োগ করা হয় তার উপর নির্ভর করবে।
হাওয়ার্ড লোভাত

@ কেনি উইঙ্কলার: অ্যাপল কীভাবে এটি কাজ করে তা সবেমাত্র স্পষ্ট করে জানিয়েছে, দেখুন ডেভেলপার.অ্যাপল . com/সভিট / ব্লগ /?id=7 । এতে তারা বলেছে যে "প্রথমবারের মতো জাভার মতোই কোনও বিশ্বব্যাপী প্রারম্ভিককে চালিত করুন" এবং বিশেষত। তারা আরও বলে যে কভারগুলির নীচে তারা "প্রারম্ভিকটি পারমাণবিক কিনা তা নিশ্চিত করার জন্য" প্রেরণ_অ্যান্স ব্যবহার করছে "। অতএব এনাম প্রায় অবশ্যই যাওয়ার উপায় যদি না আপনার কিছু অভিনব উদ্যোগ না হয় তবে একটি বেসরকারী স্ট্যাটিক যাক এর সমাধান।
হাওয়ার্ড লোভাত

2

কেবলমাত্র রেফারেন্সের জন্য, এখানে একটি উদাহরণ রয়েছে জ্যাক উ / এইচপিফিকের নেস্টেড স্ট্রাক্ট বাস্তবায়নের সিঙ্গলটন বাস্তবায়ন। প্রয়োগটি আর্কাইভগুলি কীভাবে কাজ করতে পারে পাশাপাশি কিছু কিছু কার্যকারিতাও দেখায়। আমি উদাহরণের এই সম্পূর্ণটি খুঁজে পেলাম না, আশা করি এটি কারওর পক্ষে সহায়তা করবে!

import Foundation

class ItemStore: NSObject {

    class var sharedStore : ItemStore {
        struct Singleton {
            // lazily initiated, thread-safe from "let"
            static let instance = ItemStore()
        }
        return Singleton.instance
    }

    var _privateItems = Item[]()
    // The allItems property can't be changed by other objects
    var allItems: Item[] {
        return _privateItems
    }

    init() {
        super.init()
        let path = itemArchivePath
        // Returns "nil" if there is no file at the path
        let unarchivedItems : AnyObject! = NSKeyedUnarchiver.unarchiveObjectWithFile(path)

        // If there were archived items saved, set _privateItems for the shared store equal to that
        if unarchivedItems {
            _privateItems = unarchivedItems as Array<Item>
        } 

        delayOnMainQueueFor(numberOfSeconds: 0.1, action: {
            assert(self === ItemStore.sharedStore, "Only one instance of ItemStore allowed!")
        })
    }

    func createItem() -> Item {
        let item = Item.randomItem()
        _privateItems.append(item)
        return item
    }

    func removeItem(item: Item) {
        for (index, element) in enumerate(_privateItems) {
            if element === item {
                _privateItems.removeAtIndex(index)
                // Delete an items image from the image store when the item is 
                // getting deleted
                ImageStore.sharedStore.deleteImageForKey(item.itemKey)
            }
        }
    }

    func moveItemAtIndex(fromIndex: Int, toIndex: Int) {
        _privateItems.moveObjectAtIndex(fromIndex, toIndex: toIndex)
    }

    var itemArchivePath: String {
        // Create a filepath for archiving
        let documentDirectories = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)
        // Get the one document directory from that list
        let documentDirectory = documentDirectories[0] as String
        // append with the items.archive file name, then return
        return documentDirectory.stringByAppendingPathComponent("items.archive")
    }

    func saveChanges() -> Bool {
        let path = itemArchivePath
        // Return "true" on success
        return NSKeyedArchiver.archiveRootObject(_privateItems, toFile: path)
    }
}

এবং যদি আপনি এই কয়েকটি ফাংশন সনাক্ত না করে থাকেন তবে এখানে আমি ব্যবহার করছি একটি সামান্য জীবিত সুইফট ইউটিলিটি ফাইল:

import Foundation
import UIKit

typealias completionBlock = () -> ()

extension Array {
    func contains(#object:AnyObject) -> Bool {
        return self.bridgeToObjectiveC().containsObject(object)
    }

    func indexOf(#object:AnyObject) -> Int {
        return self.bridgeToObjectiveC().indexOfObject(object)
    }

    mutating func moveObjectAtIndex(fromIndex: Int, toIndex: Int) {
        if ((fromIndex == toIndex) || (fromIndex > self.count) ||
            (toIndex > self.count)) {
                return
        }
        // Get object being moved so it can be re-inserted
        let object = self[fromIndex]

        // Remove object from array
        self.removeAtIndex(fromIndex)

        // Insert object in array at new location
        self.insert(object, atIndex: toIndex)
    }
}

func delayOnMainQueueFor(numberOfSeconds delay:Double, action closure:()->()) {
    dispatch_after(
        dispatch_time(
            DISPATCH_TIME_NOW,
            Int64(delay * Double(NSEC_PER_SEC))
        ),
        dispatch_get_main_queue()) {
            closure()
    }
}

2

দ্রুত পদক্ষেপে, আপনি নিম্নলিখিত পদ্ধতিতে একটি সিঙ্গলটন ক্লাস তৈরি করতে পারেন:

class AppSingleton: NSObject {

    //Shared instance of class
    static let sharedInstance = AppSingleton()

    override init() {
        super.init()
    }
}

1

আমি এই বাস্তবায়ন পছন্দ করি:

class APIClient {

}

var sharedAPIClient: APIClient = {
    return APIClient()
}()

extension APIClient {
    class func sharedClient() -> APIClient {
        return sharedAPIClient
    }
}

1

আমার সুইফটে বাস্তবায়নের উপায় ...

ConfigurationManager.swift

import Foundation

    let ConfigurationManagerSharedInstance = ConfigurationManager()
 class ConfigurationManager : NSObject {
    var globalDic: NSMutableDictionary = NSMutableDictionary()

class var sharedInstance:ConfigurationManager {
    return ConfigurationManagerSharedInstance

}

init() {

    super.init()

    println ("Config Init been Initiated, this will be called only onece irrespective of many calls")   

}

নীচের মাধ্যমে অ্যাপ্লিকেশনটির যে কোনও পর্দা থেকে গ্লোবালডিক অ্যাক্সেস করুন।

পড়ুন:

 println(ConfigurationManager.sharedInstance.globalDic)  

লিখুন:

 ConfigurationManager.sharedInstance.globalDic = tmpDic // tmpDict is any value that to be shared among the application

1

একমাত্র সঠিক পদ্ধতির নীচে রয়েছে।

final class Singleton {
    static let sharedInstance: Singleton = {
        let instance = Singleton()
        // setup code if anything
        return instance
    }()

    private init() {}
}

অ্যাক্সেস করতে

let signleton = Singleton.sharedInstance

কারণ:

  • static প্রকারের সম্পত্তিটি একবারে একসাথে একাধিক থ্রেডে অ্যাক্সেস করা হলেও অলসভাবে একবার শুরু করার নিশ্চয়তা দেওয়া হয়, সুতরাং ব্যবহারের প্রয়োজন নেই dispatch_once
  • বেসরকারীকরণ initপদ্ধতির যাতে অন্য শ্রেণি দ্বারা উদাহরণ তৈরি করা যায় না।
  • final ক্লাস যেমন আপনি চান না অন্য ক্লাসগুলি সিঙ্গলটন ক্লাসের উত্তরাধিকারী হয়।

আপনি সরাসরি ব্যবহার করতে গিয়ে ক্লোজার static let sharedInstance = Singleton()
ইনিশিয়েশন

1
আপনি যদি কোনও অতিরিক্ত সেটআপ করতে না চান তবে আপনি যা বলছেন তা সঠিক।
আপেলফ্রেক

1

ডেভিডের বাস্তবায়ন দেখার পরে, দেখে মনে হচ্ছে যে কোনও একক শ্রেণির ক্রিয়াকলাপ করার দরকার নেই instanceMethodযেহেতু ক্লাস পদ্ধতি letহিসাবে একই কাজ করছে sharedInstance। আপনাকে যা করতে হবে তা হ'ল এটি একটি বৈশ্বিক ধ্রুবক হিসাবে ঘোষণা এবং এটি হবে।

let gScopeManagerSharedInstance = ScopeManager()

class ScopeManager {
   // No need for a class method to return the shared instance. Use the gScopeManagerSharedInstance directly. 
}

2
আমি আমার মন্তব্যে যেমন বলছি, এটি করার একমাত্র কারণ হ'ল ভবিষ্যতের কোনও সময় আপনি গ্লোবাল ভেরিয়েবলটি সরিয়ে / আড়াল করতে এবং আরও সিঙ্গলটনের মতো আচরণ পেতে পারেন। এই মুহুর্তে, যদি সবকিছু একটি সামঞ্জস্যপূর্ণ প্যাটার্ন ব্যবহার করে থাকে তবে আপনি ব্যবহারটি পরিবর্তন না করে কেবল সিঙ্গলটন ক্লাসগুলি নিজেরাই পরিবর্তন করতে পারেন।
ডেভিড বেরি

0
   func init() -> ClassA {
    struct Static {
        static var onceToken : dispatch_once_t = 0
        static var instance : ClassA? = nil
    }

    dispatch_once(&Static.onceToken) {
        Static.instance = ClassA()
    }

    return Static.instance!
}

যেমনটি এখানে বিশাল দৈর্ঘ্যে আলোচনা করা হয়েছে, dispatch_onceস্থিতিশীল পরিবর্তনশীল সূচনাটি অলস এবং স্বয়ংক্রিয়ভাবে dispatch_once অ্যাপলের মাধ্যমে সুরক্ষিত হওয়ার কারণেই প্রাথমিকভাবে মোড়ানোর জন্য দ্রুত প্রয়োজন হয় না কারণ সেই কারণেই প্রেরণ_অনসের পরিবর্তে স্ট্যাটিক ব্যবহার করার পরামর্শ দেয়।
ডেভিড বেরি

0

অতীতে সিঙ্গেলটন অনুধাবনের জন্য সুইফট, তিনটি উপায় ছাড়া আর কিছুই নয়: গ্লোবাল ভেরিয়েবল, অভ্যন্তরীণ ভেরিয়েবল এবং প্রেরণ_আনসেস উপায়।

এখানে দুটি ভাল সিঙ্গলটন রয়েছে note , অবজেক্টটি তৈরি করতে ডিফল্ট ইনিশিয়েশন পদ্ধতি দ্বারা এই শ্রেণীর '()' এর অন্যান্য অবজেক্টগুলি প্রতিরোধ করুন))

পদ্ধতি 1:

class AppManager {
    private static let _sharedInstance = AppManager()

    class func getSharedInstance() -> AppManager {
       return _sharedInstance
    }

    private init() {} // Privatizing the init method
}

// How to use?
AppManager.getSharedInstance()

পদ্ধতি 2:

class AppManager {
    static let sharedInstance = AppManager()

    private init() {} // Privatizing the init method
}

// How to use?
AppManager.sharedInstance

-1

এটি থ্রেড নিরাপদ ক্ষমতা সহ সবচেয়ে সহজ। অন্য কোনও থ্রেড চাইলেও একই সিঙ্গলটন অবজেক্টে অ্যাক্সেস করতে পারে না। সুইফট 3/4

struct DataService {

    private static var _instance : DataService?

    private init() {}   //cannot initialise from outer class

    public static var instance : DataService {
        get {
            if _instance == nil {
                DispatchQueue.global().sync(flags: .barrier) {
                    if _instance == nil {
                        _instance = DataService()
                    }
                }
            }
            return _instance!
        }
    }
}

2
স্থিতিশীল ধরণের সম্পত্তি (যা একসাথে একাধিক থ্রেড জুড়ে অ্যাক্সেস করার পরেও একবারে অলসভাবে শুরু করার নিশ্চয়তা দেওয়া হয়েছে) এর সুবিধা কী?
মার্টিন আর

-1

উত্তরাধিকারের অনুমতি দেওয়ার জন্য আমার সিঙ্গলটনের প্রয়োজন ছিল এবং এর সমাধানগুলির কোনওটিই এটির অনুমতি দেয় না। সুতরাং আমি এটি নিয়ে এসেছি:

public class Singleton {
    private static var sharedInstanceVar = Singleton()

    public class func sharedInstance() -> Singleton {
        return sharedInstanceVar
    }
}


public class SubSingleton: Singleton {

    private static var sharedInstanceToken: dispatch_once_t = 0

    public class override func sharedInstance() -> SubSingleton {
        dispatch_once(&sharedInstanceToken) {
            sharedInstanceVar = SubSingleton()
        }
    return sharedInstanceVar as! SubSingleton
    }
}
  • এইভাবে Singleton.sharedInstance()প্রথম করার সময় এটির উদাহরণটি ফিরে আসবেSingleton
  • যখন করছেন SubSingleton.sharedInstance()প্রথমে দৃষ্টান্ত ফিরে আসবে SubSingletonসৃষ্টি করেছেন।
  • যদি উপরোক্ত সম্পন্ন করা হয়, তারপর SubSingleton.sharedInstance()হয় Singletonহয় সত্য ও একই উদাহরণস্বরূপ ব্যবহার করা হয়।

এই প্রথম নোংরা পদ্ধতির সমস্যাটি হ'ল আমি গ্যারান্টি দিতে পারি না যে সাবক্লাসগুলি বাস্তবায়িত হবে dispatch_once_tএবং এটি নিশ্চিত করে যে sharedInstanceVarপ্রতি ক্লাসে কেবল একবার সংশোধিত হয়েছে।

আমি এটি আরও পরিমার্জন করার চেষ্টা করব, তবে এটি আকর্ষণীয় হবে যে কারও বিরুদ্ধে এর বিরুদ্ধে তীব্র অনুভূতি রয়েছে কিনা (এগুলি হ'ল এটি ভার্জোজ এবং ম্যানুয়ালি এটি আপডেট করার প্রয়োজন রয়েছে)।


-2

এটি আমার বাস্তবায়ন। এটি প্রোগ্রামারকে একটি নতুন উদাহরণ তৈরি করতে বাধা দেয়:

let TEST = Test()

class Test {

    private init() {
        // This is a private (!) constructor
    }
}

private initইতিমধ্যে এখানে পরামর্শ দেওয়া হয়েছিল: stackoverflow.com/a/28436202/1187415
মার্টিন আর

-2

আমি নিম্নলিখিত বাক্য গঠন ব্যবহার করি:

public final class Singleton {    
    private class func sharedInstance() -> Singleton {
        struct Static {
            //Singleton instance.
            static let sharedInstance = Singleton()
        }
        return Static.sharedInstance
    }

    private init() { }

    class var instance: Singleton {
        return sharedInstance()
    }
}

এটি সুইফট 1.2 থেকে 4 অবধি 4 টি পর্যন্ত কাজ করে এবং এর বিভিন্ন সুবিধা রয়েছে:

  1. সাবক্লাস বাস্তবায়ন না করার জন্য ব্যবহারকারীকে মনে করিয়ে দেয়
  2. অতিরিক্ত দৃষ্টান্ত তৈরি করা রোধ করে
  3. অলস সৃষ্টি এবং অনন্য তাত্পর্য নিশ্চিত করে
  4. উদাহরণটি অ্যাক্সেস করার অনুমতি দিয়ে সিনট্যাক্সকে ছোট করে ((এড়ানো)) করে Singleton.instance
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.