يقدم
بدءًا من هذا الفصل ، سنقدم تدريجياً تطبيقات نمط التصميم المختلفة المستخدمة في JavaScript. هنا لن أقدم الكثير من النظريات عن النمط نفسه ، لكنني لن أركز إلا على التنفيذ. حسنًا ، تبدأ رسميًا.
في عيون مهندسي التطوير التقليدي ، تتمثل المفرد في التأكد من أن الفصل لديه مثيل واحد فقط. طريقة التنفيذ عمومًا لتحديد ما إذا كان مثيل موجود أم لا. إذا كانت موجودة ، فسيتم إرجاعها مباشرة ، وإذا لم تكن موجودة ، فسيتم إنشاؤها ثم إرجاعها ، مما يضمن أن لدى الفصل كائن مثيل واحد فقط. في JavaScript ، يعمل Singleton كمزود مساحة اسم ، ويوفر نقطة وصول فريدة من مساحة الاسم العالمية للوصول إلى الكائن.
نص
في JavaScript ، هناك العديد من الطرق لتنفيذ المفردات. أسهل طريقة هي استخدام الكائن الحرفي ، والذي يمكن أن يحتوي على عدد كبير من الخصائص والطرق:
نسخة الكود كما يلي:
var mysingleton = {
Property1: "شيء" ،
Property2: "شيء آخر" ،
الطريقة 1: Function () {
console.log ('Hello World') ؛
}
} ؛
إذا كنت ترغب في تمديد الكائن لاحقًا ، فيمكنك إضافة أعضاء وأساليب خاصة بك ، ثم استخدام إغلاق لتغليف هذه المتغيرات وإعلانات الوظائف الموجودة بداخلها. فقط الأعضاء العامون والأساليب التي تريد فضحها يتعرضون. رمز العينة كما يلي:
نسخة الكود كما يلي:
var mysingleton = function () {
/* إعلان المتغيرات والأساليب الخاصة هنا*/
var privateVariable = 'شيء خاص' ؛
وظيفة showprivan () {
console.log (privatevariable) ؛
}
/ * المتغيرات والأساليب العامة (يمكن الوصول إلى المتغيرات والأساليب الخاصة) */
يعود {
PublicMethod: Function () {
showprivan () ؛
} ،
Publicvar: "يمكن للجمهور رؤية هذا!"
} ؛
} ؛
var single = mysingleton () ؛
single.publicmethod () ؛ // الإخراج "شيء خاص"
console.log (single.publicvar) ؛ // الإخراج "يمكن للجمهور رؤية هذا!"
الرمز أعلاه جيد جدًا ، ولكن ماذا لو كنا نرغب في القيام بذلك فقط عندما نستخدمه؟ لغرض توفير الموارد ، يمكننا تهيئة هذه الرموز في مُنشئ آخر ، على النحو التالي:
نسخة الكود كما يلي:
var singleton = (function () {
var instanted ؛
وظيفة init () {
/*حدد رمز Singleton هنا*/
يعود {
PublicMethod: Function () {
console.log ('Hello World') ؛
} ،
PublicProperty: "اختبار"
} ؛
}
يعود {
getInstance: function () {
if (! instanted) {
instanted = init () ؛
}
إعادة إنشاء مثيل ؛
}
} ؛
}) () ؛
/*استدعاء طريقة عامة للحصول على المثيل:*/
singleton.getInstance (). publicmethod () ؛
أعرف كيفية تنفيذ المفردات ، ولكن ما نوع السيناريو هو أفضل سيناريو لاستخدامه في المفردات؟ في الواقع ، يتم استخدام المفردات بشكل عام لتنسيق التواصل بين أوضاع مختلفة بين الأنظمة. الرمز التالي هو أفضل الممارسات للفرد:
نسخة الكود كما يلي:
var singletontester = (function () {
// المعلمة: تم تمرير مجموعة من المعلمات إلى المفرد
وظيفة singleton (args) {
// قم بتعيين متغير args على المعلمة المستلمة أو أن تكون فارغة (إذا لم يتم توفيرها)
var args = args || {} ؛
// تعيين معلمات الاسم
this.name = 'singletontester' ؛
// اضبط قيمة pointx
this.pointx = args.pointx || 6 ؛ // احصل من المعلمات المستلمة ، أو تعيين على القيمة الافتراضية
// اضبط قيمة Pointy
this.pointy = args.pointy || 10 ؛
}
// حاوية مثيل
var مثيل ؛
var _static = {
الاسم: 'Singletontester' ،
// طريقة للحصول على مثيل
// إرجاع مثيل Singleton
getInstance: وظيفة (args) {
إذا (مثيل === غير محدد) {
مثيل = New Singleton (args) ؛
}
مثيل العودة ؛
}
} ؛
العودة _static ؛
}) () ؛
var singletontest = singletontester.getInstance ({pointx: 5}) ؛
console.log (singletontest.pointx) ؛ // الإخراج 5
طرق التنفيذ الأخرى
الطريقة 1:
نسخة الكود كما يلي:
وظيفة الكون () {
// حدد ما إذا كان هناك مثيل
if (typeof Universe.Instance === 'Object') {
عودة الكون.
}
// محتوى آخر
this.start_time = 0 ؛
this.bang = "big" ؛
// ذاكرة التخزين المؤقت
الكون.
// إرجاع هذا ضمنيًا
}
// امتحان
var uni = new Universe () ؛
var uni2 = New Universe () ؛
console.log (uni === uni2) ؛ // حقيقي
الطريقة 2:
نسخة الكود كما يلي:
وظيفة الكون () {
// مثيل ذاكرة التخزين المؤقت
var مثيل = هذا ؛
// محتوى آخر
this.start_time = 0 ؛
this.bang = "big" ؛
// أعد كتابة المنشئ
الكون = وظيفة () {
مثيل العودة ؛
} ؛
}
// امتحان
var uni = new Universe () ؛
var uni2 = New Universe () ؛
uni.bang = "123" ؛
console.log (uni === uni2) ؛ // حقيقي
console.log (uni2.bang) ؛ // 123
الطريقة 3:
نسخة الكود كما يلي:
وظيفة الكون () {
// مثيل ذاكرة التخزين المؤقت
var مثيل ؛
// إعادة بناء الوظيفة
الكون = وظيفة الكون () {
مثيل العودة ؛
} ؛
// بعد المعالجة من خصائص النموذج الأولي
الكون. النمط النمطي = هذا ؛
// مثال
مثيل = الكون الجديد () ؛
// إعادة ضبط مؤشر المنشئ
مثيل. constructor = الكون ؛
// وظائف أخرى
مثيل. start_time = 0 ؛
مثيل. bang = "big" ؛
مثيل العودة ؛
}
// امتحان
var uni = new Universe () ؛
var uni2 = New Universe () ؛
console.log (uni === uni2) ؛ // حقيقي
// إضافة خصائص النموذج الأولي
الكون.
var uni = new Universe () ؛
الكون. النمط النموذجي. كل شيء = صحيح ؛
var uni2 = New Universe () ؛
console.log (uni.nothing) ؛ // حقيقي
console.log (uni2.nothing) ؛ // حقيقي
console.log (uni.everything) ؛ // حقيقي
console.log (uni2. everything) ؛ // حقيقي
console.log (uni.constructor === Universe) ؛ // حقيقي
الطريقة 4:
نسخة الكود كما يلي:
Var Universe ؛
(وظيفة () {
var مثيل ؛
الكون = وظيفة الكون () {
إذا (مثيل) {
مثيل العودة ؛
}
مثيل = هذا ؛
// محتوى آخر
this.start_time = 0 ؛
this.bang = "big" ؛
} ؛
} ()) ؛
// رمز الاختبار
var a = new Universe () ؛
var b = new Universe () ؛
تنبيه (a === b) ؛ // حقيقي
A.Bang = "123" ؛
تنبيه (B.Bang) ؛ // 123