Zavod konstruktori
Odatiy bo'lib, sinf konstruktorlari ushbu sinfning yangi ob'ektini yaratadilar va qaytaradilar. Lekin har doim ham yangi sinf ob'ektini yaratish kerak bo'lmasligi mumkin. Biz konstruktordan mavjud ob'ektdan foydalanishni va qaytarishni xohlashimiz mumkin. Buning uchun Dart zavod konstruktorlari yoki zavod kalit so'zidan oldin joylashgan konstruktorlardan foydalanadi.
Masalan, quyidagi dasturni ko'rib chiqing:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
void main (){
Application myApp1 = Application("Internet Browser");
Application myApp2 = Application("Internet Browser 2");
myApp2.about();
}
class Application{
String name;
static Application app = Application.fromName("");
Application.fromName(this.name);
factory Application(String name) {
if(app.name == ""){
app = Application.fromName(name);
print("Приложение $name запущено");
}
else{
// в фабричных конструкторах нельзя обращаться к this
// print("В приложении ${this.name} открыта новая вкладка");
print("В приложении ${app.name} открыта новая вкладка");
}
return app;
}
void about(){
print("Приложение $name");
}
}
|
Bunday holda, ilovani ifodalovchi Application sinfi aniqlanadi. Aytaylik, bizning vazifamiz bir vaqtning o'zida faqat bitta dasturni ishga tushirishdir. Shu maqsadda biz sinfda Ilova turini ifodalovchi statik o'zgaruvchi ilovasini aniqlaymiz. Va biz ilovaning shartli nomini saqlash uchun o'zgaruvchi nomini ham aniqlaymiz.
Ilova sinfi nomni o'rnatuvchi Application.fromName nomli konstruktorni belgilaydi.
Va zavod konstruktori ham aniqlanadi:
1
2
3
4
5
6
7
8
9
10
11
12
|
factory Application(String name) {
if(app.name == ""){
app = Application.fromName(name);
print("Приложение $name запущено");
}
else{
// в фабричных конструкторах нельзя обращаться к this
// print("В приложении ${this.name} открыта новая вкладка");
print("В приложении ${app.name} открыта новая вкладка");
}
return app;
}
|
Oddiy konstruktorlar kabi zavod konstruktori ham parametrlarni qabul qilishi mumkin. Bunday holda, biz nom o'rnatish uchun konstruktorga o'tamiz.
Konstruktorning o'zida biz nom o'zgaruvchisi bo'sh qatorga teng yoki yo'qligini tekshiramiz, so'ngra Application.fromName konstruktori yordamida yangi Application ob'ektini yaratamiz va uni ilova o'zgaruvchisiga tayinlaymiz. Agar ob'ekt allaqachon yaratilgan bo'lsa, biz shunchaki ba'zi ma'lumotlarni ko'rsatamiz. Va oxirida biz yaratilgan ob'ektni qaytaramiz.
Ya'ni, zavod konstruktori yangi Application ob'ektini yaratadi, agar u mavjud bo'lmasa (nom o'zgaruvchisi bo'sh qatorni bildiradi) yoki mavjud ob'ektni qaytaradi. Ya'ni, biz birlikda mavjud bo'lgan ob'ektni olamiz.
Shuni ham yodda tutingki, zavod konstruktorlarida joriy ob'ektga this kalit so'zi orqali murojaat qila olmaysiz:
1
|
//print("В приложении ${this.name} открыта новая вкладка");
|
Asosiy funktsiyada biz ushbu sinfning ikkita o'zgaruvchisini aniqlaymiz:
1
2
3
4
5
6
|
void main (){
Application myApp1 = Application("Internet Browser");
Application myApp2 = Application("Internet Browser 2");
myApp2.about();
}
|
Konsol chiqishi:
Internet-brauzer ishlamoqda
Internet-brauzerda yangi yorliq ochiladi
Internet-brauzer dasturi
Konsol chiqishidan biz yangi Application ob'ektini yaratuvchi Application.fromName konstruktori faqat bir marta ishga tushishini ko'rishimiz mumkin. Ikkinchi o'zgaruvchining nomini o'rnatishda birinchi o'zgaruvchining nomi ham o'zgarishini ham ko'ramiz. Chunki bu holda faqat bitta Ilova obyekti mavjud va myApp1 va myApp2 o‘zgaruvchilari bir xil obyektga ishora qiladi.
Ushbu texnikani qayerda qo'llash mumkin? Birinchidan, bu keshlashning turli xil variantlari, yangi ob'ekt yaratish uchun qo'shimcha resurslarni sarflash o'rniga, biz keshdan mavjud ob'ektni olishimiz mumkin. Va agar u yo'q bo'lsa, uni yarating.
|