Zavod üsulu nümunəsi c. Zavod üsulu nümunəsi - sinif səviyyəsi. Zavod metodunun təsviri




Fabrika metodu alt siniflərə ümumi interfeysdən istifadə edərək bəzi siniflər yaratmağa imkan verir və alt siniflər hansı əsas obyektin həyata keçirilməli olduğunu müəyyən edir. Yəni bir növ ümumi interfeysə ehtiyacımız var. C# proqramlaşdırma dilində olan bu interfeys abstrakt sinif və ya interfeys ola bilər.

Bu kimi mücərrəd bir sinif təsəvvür edin:

Mücərrəd sinif Məhsul ( ictimai mücərrəd ondalıq SatınalmaQiyməti (almaq; təyin etmək;) ictimai mücərrəd onluq Qiymət (almaq; təyin etmək;) açıq mücərrəd sətir Təsvir (almaq; təyin etmək;) )

Bu sinfi miras alsaq, polimorfizm prinsipinə əməl etməliyik. Yəni override sözündən istifadə edərək bu sinfin bütün xüsusiyyətlərini yenidən müəyyənləşdirin. Gəlin bunu edək. Biz Məhsul sinfindən miras qalan, konkret məhsulun məntiqini əhatə edəcək bir sinif yaradırıq:

Sinif Kompüteri: Məhsul ( özəl ondalık _alış_qiyməti; özəl ondalık _qiymət; özəl sətir _təsvir; ictimai Kompüter() : bu(null) ( ) ictimai Kompüter(sətir _təsviri) : bu(_təsvir, 0) ( ) ictimai Kompüter(sətir _təsviri, onluq _alış_qiyməti) : bu (_təsvir, _alış_qiyməti, 0) ( ) ictimai Kompüter(sətir _təsvir, onluq _alış_qiyməti, ondalık _qiymət) ( this._description = _təsvir; this._purchase_price = _purchase_price; this._price = ictimai təsvir) almaq ( return _description; ) set ( _description = value; ) ) public override decimal Qiymət ( get ( return _price; ) set ( _price = value; ) ) public override decimal PurchasePrice ( get ( return _purchase_price; ) set ( _purchase_price = value); )))

Product sinfi zavod üsulu ilə yaradılmış obyektlərin interfeysini müəyyən etmək üçün nəzərdə tutulmuşdur. Bu, məhsullar üçün əsas qabıq kimidir. Məhsulun qiyməti var və s. İstəyirsinizsə, Məhsul sinfinə bir neçə daha çox xassə və üsul əlavə edin və onları irsi sinifdə yenidən təyin edin. Ümid edirəm ki, indi hər şey aydındır. Davam etməzdən əvvəl nümunənin özü haqqında bir neçə söz deyəcəyəm. Biz adətən konkret sinifdən istifadə edirik və onu belə yazırıq:

Kompüter kompüteri = yeni Kompüter();

Amma bu nümunə proqram mətnində hər hansı konkret siniflərlə deyil, onların mücərrəd təsvirləri ilə işləyə biləcəyinizi bildirir. Burada müzakirə olunan nümunədən istifadə etməyin mənasız olduğu ən məşhur hallar bunlardır:

  • altsinifləri yaradan sinif onların nə olacağını əvvəlcədən bilmir;
  • sinif elə qurulmuşdur ki, onun yaratdığı obyektlər alt siniflər tərəfindən təyin olunsun;
  • sinif öz vəzifələrini köməkçi yarımsiniflərdən birinə həvalə edir, bundan sonra hansı sinfin bu vəzifələri öz üzərinə götürməsi barədə biliklərin lokallaşdırılması planlaşdırılır;

Demək istədiyimiz budur:

Diaqrama daha iki sinif əlavə edildi. Nümunədən sonra, zavod metodunu ehtiva edən başqa bir mücərrəd sinif olmalıdır. Müəyyən bir növ məhsul yaradan fabrik kimidir. Zavod üsulu ilə mücərrəd sinif Creator müəyyən edildikdən sonra biz konkret məhsul üçün öz irsi sinifimizi yarada bilərik. Anlamağı asanlaşdırmaq üçün diaqramı sadələşdirək:

Bütün piroqlar budur. Zavod üsuluna malik olan mücərrəd məhsul və yaradıcı sinif var. Müəyyən bir məhsul (Məhsuldan miras qalmış) yarışları üçün bir sinif yaradırıq, xüsusi bir məhsulun yaradıcısı üçün xüsusi bir sinif yaradırıq (Yaradıcıdan miras qalmış) iki.

Mücərrəd sinif Creator belə görünür:

Mücərrəd sinif Yaradıcı (ictimai mücərrəd Product FactoryMethod(); ictimai mücərrəd Product FactoryMethod(sətir _təsvir); ictimai mücərrəd Product FactoryMethod(sətir _təsvir, onluq _alış_qiyməti); ictimai mücərrəd Product FactoryMethod(sətir _təsvir, ondalık _alış_qiyməti, bu qiymətdə); sinfində, Kompüter sinfində bütün növ konstruktorlar üçün metodlar müəyyən etmişəm. Və burada Kompüter sinfi üçün yaradıcı sinfi var: sinif ComputerCreator: Yaradıcı ( ictimai ləğv Product FactoryMethod() ( qaytarmaq new Computer(); ) public override Product FactoryMethod(string _description) ( return new Computer(_description); ) public override Product FactoryMethod( sətir _təsvir, onluq _alış_qiymətini qaytarın) (yeni Kompüteri qaytarın(_təsvir, _alış_qiyməti); ) açıq məhsulun FactoryMethod(sətir _təsvir, onluq _alış_qiyməti, onluq _qiyməti) (yeni Kompüteri qaytarın(_təsvir,_alış_qiyməti));

Budur, indi hər şey şəkildəki kimidir. 1. Kompüter sinfinin tələb olunan konstruktorunu çağıra bilmək üçün zavod metodlarının həddindən artıq yükləndiyini görürük.

Gəlin oxşar şəkildə başqa bir CDPlayer sinfi və onun üçün yaradıcı sinif yaradaq:

CDPlayer sinfi:

Sinif CDPlayer: Məhsul ( özəl ondalık _alış_qiyməti; // alış qiyməti şəxsi ondalık _qiymət; // satış qiyməti // CD pleyerin şəxsi sətir _təsvirini dəstəklədiyi formatlar massivi; ictimai CDPlayer() : this(null) ( ) ictimai CDPlayer(string) _description ) : this(_description, 0) ( ) public CDPlayer(string _description, decimal _purchase_price) : this(_description, _purchase_price, 0) ( ) public CDPlayer(string _description, decimal _purchase_price, this ._pricedection; decimal = decimal_ _pricedection) bu ._alış_qiyməti = _alış_qiyməti; bu._qiymət = _qiymət; ) ictimai ləğv sətri Təsvir ( almaq ( _təsviri qaytarmaq; ) təyin etmək ( _təsvir = dəyər; ) ) ictimai ləğv ondalıq Qiymət ( almaq ( _qiyməti qaytarmaq; ) set( _qiymət = dəyər;) ) ictimai ləğv ondalık PurchasePrice ( əldə edin ( _alış_qiymətini qaytarın; ) təyin edin ( _satın_qiyməti = dəyər;) ) )

CDPlayer sinfi üçün yaradıcı sinfi:

Sinif CDPlayerCreator: Yaradıcı ( ictimai ləğv Product FactoryMethod() ( qaytar yeni CDPlayer(); ) ictimai ləğv Product FactoryMethod(string _description) ( qaytar yeni CDPlayer(_description); ) ictimai ləğv Product FactoryMethod(string _description, decimal _rescription)(purchase newprice) CDPlayer(_təsvir, _alış_qiyməti); ) ictimaiyyətə yalnış yazın Product FactoryMethod(sətir _təsvir, onluq _alış_qiyməti, onluq _qiymət) (yeni CDPlayer(_təsvir, _alış_qiyməti, _qiymət); ) )

Bizə qalan işimizə heyran olmaq üçün müştəri kodu yazmaqdır.

Statik boşluq Əsas (simli args) ( Siyahı ProductList = yeni Siyahı (); Yaradıcı yaradıcılar = yeni Yaradıcı; yaradıcılar = yeni ComputerCreator(); yaradıcılar = yeni CDPlayerCreator(); foreach (yaradıcılarda Creator cr) ( if (cr ComputerCreator-dur) productList.Add(cr.FactoryMethod("Laptop", 600, 800)); if (cr - CDPlayerCreator) productList.Add(cr.FactoryMethod("audio, mp3) ,mp4",250,360)); ) foreach (Product pr məhsul siyahısında) ( Console.WriteLine("Sinif obyekti (0);\n" + "Təsvir: (1);\n" + "Satınalma qiyməti: (2 ) ;\n" + "Satış qiyməti: (3);\n", pr.GetType().Ad, pr.Description, pr.PurchasePrice, pr.Price); ) Console.ReadLine(); )

Proqramın nəticəsi budur:

Mənə gəlincə, bu maraqlı faktdır. Mücərrəd sinfin nümunəsi yaradıla bilməz. Amma heç kim demədi ki, bu, baza rolunu oynaya bilməz. Bunu belə yazsanız, hər şey yaxşı olacaq:

Məhsul pr = yeni Kompüter();

Budur link pr(abstrakt sinif) Kompüter sinfinin obyektinə aiddir. Bu səbəbdən, edildiyi kimi, asanlıqla xüsusi bir kolleksiya yarada bilərəm. Bu şablonu görəndə dərhal aşağıdakı inkişaf mərhələlərini gördüm:

  • Obyektlər üçün mücərrəd sinif -> əksinə, onu öz məqsədləri üçün həyata keçirən bir sinif.
  • Obyektlər yaratmaq üçün mücərrəd bir sinif -> əksinə, öz obyektlərini yaratmaq üçün onu həyata keçirən bir sinif.
Başqa sözlə:

Məhsul- məhsulun özü. Zavod üsulu ilə yaradılmış obyektlərin interfeysini müəyyən etmək üçün nəzərdə tutulmuşdur;

Beton Məhsulu(Kompüter, CDPlayer) - sxemdə iştirak edən və mücərrəd sinif (interfeys) Məhsulun həyata keçirilməsinə cavabdeh olan xüsusi məhsullar.

Yaradan yaradıcıdır və onun adı öz sözünü deyir. Bu obyekt Product tipli obyekti qaytaran zavod metodunu elan etmək üçün nəzərdə tutulub.

Beton Yaradıcısı- xüsusi yaradıcı. Burada hər şey göz qabağındadır: yaradıcının xüsusi tətbiqi müəyyən bir məhsulun qaytarılması ilə məşğul olur. Bizim nümunəmizdə iki konkret yaradıcı tətbiqi ComputerCreator və CDPlayerCreator-dur.

Yaradıcı müvafiq spesifik məhsulu həyata keçirmək üçün öz alt siniflərinə etibar edir. Məsələ bundadır Zavod üsulu.

İndi bu nümunənin müsbət və mənfi cəhətlərini qeyd edək:

Zavod Metodunun ən bariz çatışmazlığı, yeni bir məhsul növü (yəni, yeni Beton Məhsulu) əldə etməyi planlaşdırdığınız zaman Yaradıcı varisinin yaradılması ehtiyacıdır. Və bu, təəssüf ki, qarşısını almaq mümkün deyil. Lakin oxşar problem bir çox generativ nümunələrdə mövcuddur. Üstünlüklərə xüsusi siniflərə diqqət yetirmədən və ümumi interfeysdən istifadə etmədən daha universal obyektlər yaratmaq imkanı daxildir.

1. ad: Zavod üsulu

2. Tapşırıqlar:

    Sistem yeni növ obyektlər əlavə etməklə genişləndirilə bilən qalmalıdır. Yeni ifadədən birbaşa istifadə etmək məqsədəuyğun deyil, çünki bu, xüsusi tipli obyektlərin yaradılması kodunun bütün proqrama səpələnməsinə səbəb ola bilər. Sonra sistemə yeni növ obyektlərin əlavə edilməsi və ya bir növ obyektin digəri ilə əvəz edilməsi kimi əməliyyatlar çətin olacaq (bölmədə ətraflı məlumat Generativ Nümunələr). Zavod metodu nümunəsi sistemə həm obyektlərin yaradılması prosesindən, həm də onların növlərindən müstəqil qalmağa imkan verir.

    Obyektin nə vaxt yaradılacağı əvvəlcədən məlumdur, lakin onun növü məlum deyil.

3. Həll yolu:

Sistemin müxtəlif obyekt tiplərindən müstəqil qalmasını təmin etmək üçün Fabrika Metod nümunəsi polimorfizm mexanizmindən istifadə edir - bütün son növlərin sinifləri polimorf istifadə üçün nəzərdə tutulmuş bir abstrakt baza sinfindən miras alınır. Bu əsas sinif istifadəçinin son növ obyektləri idarə edəcəyi vahid interfeysi müəyyən edir.

Sistemə yeni növlərin əlavə edilməsini nisbətən asanlaşdırmaq üçün Fabrika Metod nümunəsi xüsusi zavod sinfində xüsusi tipli obyektlərin yaradılmasını lokallaşdırır. Xüsusi siniflərin obyektlərinin yaradıldığı bu sinfin üsulları zavod metodları adlanır.

Zavod metodlarının interfeysi müstəqil fabrik sinifində elan edilir və onların həyata keçirilməsi bu sinfin xüsusi alt sinifləri ilə müəyyən edilir.

4. Factory Method modelinin UML sinif diaqramı. Klassik icra

Məhsul- məhsulun özü. Zavod üsulu ilə yaradılmış obyektlərin interfeysini müəyyən etmək üçün nəzərdə tutulmuşdur;

Beton Məhsulu(Kompüter) - sxemdə iştirak edən və mücərrəd sinif (interfeys) Məhsulun həyata keçirilməsinə cavabdeh olan xüsusi məhsullar.

Yaradan yaradıcıdır və onun adı öz sözünü deyir. Bu obyekt Product tipli obyekti qaytaran zavod metodunu elan etmək üçün nəzərdə tutulub.

Beton Yaradıcısı- xüsusi yaradıcı. Burada hər şey göz qabağındadır: yaradıcının xüsusi tətbiqi müəyyən bir məhsulun qaytarılması ilə məşğul olur. Bizim nümunəmizdə yaradıcının konkret həyata keçirilməsi ComputerCreator-dur.

Yaradıcı uyğun konkret məhsulu həyata keçirmək üçün öz alt siniflərinə etibar edir. Məsələ bundadır Zavod üsulu.

5. Zavod metodunun tətbiqi nümunəsi:

Product sinfi zavod üsulu ilə yaradılmış obyektlərin interfeysini müəyyən etmək üçün nəzərdə tutulmuşdur. Bu, məhsullar üçün əsas qabıq kimidir. Məhsulun qiyməti var və s.

    mücərrəd sinif Məhsul

    ictimai mücərrəd onluq Alış Qiyməti( almaq; təyin edin;}

    ictimai mücərrəd onluq Qiymət ( almaq; təyin edin;}

    ictimai mücərrəd simli Təsvir ( almaq; təyin edin;}

Biz Məhsul sinfindən miras qalan, konkret məhsulun məntiqini əhatə edəcək bir sinif yaradırıq:

    sinif Kompüter: Məhsul

    özəl onluq _alış_qiyməti;

    özəl onluq _qiymət;

    özəl simli _təsvir;

    ictimai Kompyuter( simli _təsvir, onluq _alış_qiyməti,

    onluq _qiymət)

    bu._təsvir = _təsvir;

    bu._alış_qiyməti = _alış_qiyməti;

    bu._qiymət = _qiymət;

    ictimai üstələmək simli Təsvir

    almaq { qayıtmaq _təsvir; )

    təyin edin( _təsvir = dəyər; )

    ictimai üstələmək onluq Qiymət

    almaq { qayıtmaq _qiymət; )

    təyin edin( _qiymət = dəyər; )

    ictimai üstələmək onluq Alış Qiyməti

    almaq { qayıtmaq _alış_qiyməti; )

    təyin edin( _alış_qiyməti = dəyər; )

Zavod üsuluna malik olan mücərrəd yaradıcı sinifini təsvir edək.

    mücərrəd sinif Yaradan

    ictimai mücərrəd Məhsul Fabriki Metod( simli _təsvir,

    onluq _alış_qiyməti, onluq _qiymət);

Biz konkret məhsulun yaradıcısı üçün xüsusi bir sinif yaradırıq (Yaradıcıdan miras). Bu sinif Kompüter sinfinin konstruktoru üçün metodu müəyyən edir (əgər bir neçə konstruktor varsa, onda hər bir konstruktorun öz zavod üsulu var):

    sinif Kompüter Yaradan: Yaradan

    ictimai üstələmək Məhsul Fabriki Metod( simli _təsvir,

    onluq _alış_qiyməti, onluq _qiymət)

    qayıtmaq yeni Kompüter(_təsvir,_alış_qiyməti,_qiymət);

Müştəri kodu:

    statik boşƏsas( simli args)

    Siyahı Məhsul Siyahısı = yeni Siyahı

    Yaradıcı yaradıcılar = yeni Yaradan;

    yaradıcılar = yeni ComputerCreator();

    foreach(Yaradıcı cr in yaradıcılar)

    əgər(cr edir Kompüter Yaradıcısı)

    productList.Add(cr.FactoryMethod("Laptop", 600, 800));

    foreach(Məhsul pr in məhsul siyahısı)

    Console.WriteLine("Sinifin obyekti (0);\n" +

    "Təsvir: (1);\n" +

    "Alış qiyməti: (2);\n" +

    "Satış qiyməti: (3);\n",

    pr.GetType().Ad,

  1. pr.PurchasePrice,

Proqramın nəticəsi:

6. Bu nümunənin müsbət və mənfi cəhətləri:

Zavod Metodunun ən bariz çatışmazlığı, yeni bir məhsul növü (yəni, yeni Beton Məhsulu) əldə etməyi planlaşdırdığınız zaman Yaradıcı varisinin yaradılması ehtiyacıdır. Və bu, təəssüf ki, qarşısını almaq mümkün deyil. Lakin oxşar problem bir çox generativ nümunələrdə mövcuddur. Üstünlüklərə xüsusi siniflərə diqqət yetirmədən və ümumi interfeysdən istifadə etmədən daha universal obyektlər yaratmaq imkanı daxildir.

Zavod üsulu- siniflər yaradan nümunə - istinad edir generativ nümunələrə (şablonlara)

Məqsəd

Obyekt yaratmaq üçün interfeysi müəyyən edir, lakin hansı sinfi (məhsulu) nümunələşdirəcəyinə qərar vermək üçün onu alt siniflərə buraxır.
Zavod metodu sinfə instantasiyanı alt siniflərə həvalə etməyə imkan verir.

Ləqəb

Fabrika metodu nümunəsi VirtualConstructor kimi də tanınır.

Motivasiya

Bizə müraciət edək - yaxşı, yoxsa yazmaq istəyirik - edə bilər nə deməkdir müxtəlif növ sənədlər yaratmaq- Amma hansı sənəd növü olduğunu əvvəlcədən bilmirik (= məhsul) istifadəçi seçəcək-
və buna baxmayaraq, bu sənədlərin yaradılması mexanizmi - kənardan baxdıqda - oxşar görünür - bu oxşarlıq mücərrəd siniflər tərəfindən təsvir edilir, mücərrəd siniflər yaradıla bilməz - yəni bu siniflərin obyektləri yaradıla bilməz.
Necə olmaq?

Nümunə bizə bir həll təklif edir Zavod üsulu, onu yaradan proqram sinfində konkret sənədin adını gizlədir.

Gördüyümüz kimi, burada obyektlərin iyerarxiyasının - daha doğrusu, iki paralel iyerarxiyanın - məhsulların iyerarxiyasının və bu məhsulların yaradıcılarının iyerarxiyasının qurulması təklif olunur.

Yeri gəlmişkən, bunu bu pulsuz diaqram daha aydın şəkildə nümayiş etdirir:

Uyğunluq

Aşağıdakı hallarda zavod üsulu nümunəsindən istifadə edin:

  1. sinif onun hansı siniflərin hansı obyektlərini yaratması lazım olduğu əvvəlcədən məlum deyil;
  2. sinif elə qurulmuşdur onun yaratdığı obyektlər alt siniflər tərəfindən müəyyən edilir;
  3. sinif öz vəzifələrini bir neçə köməkçi alt sinifdən birinə həvalə edir və siz planlaşdırırsınız hansı sinifin bu vəzifələri öz üzərinə götürdüyü barədə bilikləri lokallaşdırmaq.

Struktur

Bu şablonun strukturu aşağıdakı diaqram kimi təqdim edilə bilər:

İştirakçılar

  1. Məhsul(Sənəd) - məhsul: zavod üsulu ilə yaradılmış obyektlərin interfeysini müəyyən edir;
  2. Beton Məhsulu(MyDocument) xüsusi məhsul: interfaceProduct tətbiq edir;
  3. Yaradan(Tətbiq) = yaradıcı: Məhsul tipli obyekti qaytaran zavod metodunu elan edir. Yaradan zavod metodunun standart tətbiqini də müəyyən edə bilər, hansı ConcreteProduct obyektini qaytarır; Məhsul obyekti yaratmaq üçün zavod metodunu çağıra bilər.
  4. Beton Yaradıcısı(MyApplication) = konkret yaradıcı: ConcreteProduct obyektini qaytaran zavod metodunu ləğv edir.

Münasibət

Yaradan onun alt siniflərinə "güvənir"(xüsusi Yaradıcı tətbiqləri) müvafiq xüsusi məhsulun nümunəsini qaytaracaq zavod metodunun müəyyən edilməsində.

nəticələr

Zavod üsulları dizayneri koda tətbiqdən asılı sinifləri yerləşdirmək ehtiyacından azad edir. Kod yalnız Məhsul sinfi interfeysi ilə məşğul olur, ona görə də istifadəçi tərəfindən müəyyən edilmiş istənilən konkret məhsul sinifləri ilə işləyə bilər.

Potensial çatışmazlıq

Zavod metodunun potensial çatışmazlığı ondan ibarətdir ki, müştərilər yalnız bir ConcreteProduct obyekti yaratmaq üçün Yaradıcı alt-sinif etməli ola bilər. Müştəri hər hansı bir şəkildə Yaradıcının alt siniflərini yaratmalı olduqda, alt təsnifat əsaslandırılır,əks halda müştəriyə əlavə bir alt sinif təbəqəsi ilə məşğul olmalı olacaqsınız.

Frabrik metod modelinin daha iki mümkün tətbiqi:

Alt siniflərin çəngəl əməliyyatları ilə təmin edilməsi

Zavod metodundan istifadə edərək sinif daxilində obyektlərin yaradılması həmişə onları birbaşa yaratmaqdan daha çevikdir. Zavod metodu genişləndirilmiş versiyanı təmin etmək üçün alt siniflərdə çəngəl əməliyyatları yaradır
obyekt.

Sənəd nümunəsində Document sinfi mövcud sənəddən fayl seçmək üçün dialoq qutusu yaradan CreateFileDialog zavod metodunu təyin edə bilər. Bu sinfin alt sinfi müəyyən edə bilər
bu zavod metodunu əvəz edən proqrama xas dialoq qutusu. Bu halda, zavod metodu mücərrəd deyil, ağlabatan standart tətbiqi ehtiva edir;

Zavod üsulları yalnız yaradıcı tərəfindən deyilə bilər: müştərilər də zavod üsullarından istifadə edə bilərlər, xüsusilə iştirakı ilə.

Məsələn, interaktiv şəkildə manipulyasiya edilə bilən qrafik formaları nəzərdən keçirin: siçan ilə uzadılmış, köçürülmüş və ya fırlanmış.
Bu cür istifadəçi qarşılıqlı əlaqələrini həyata keçirmək həmişə asan deyil. Çox vaxt manipulyasiyaların cari vəziyyəti haqqında məlumatları saxlamaq və yeniləmək lazımdır. Ancaq bu vəziyyət yalnız manipulyasiyanın özü zamanı lazımdır, buna görə də rəqəmi təmsil edən obyektə yerləşdirilməməlidir. Bundan əlavə, rəqəmlər uyğun olaraq davranır

Məsələn, bir seqmentin uzanması son nöqtənin mövqeyinin dəyişdirilməsinə, mətnin uzadılması isə dəyişdirilməsinə qədər azaldıla bilər.
sətir aralığı.

Belə məhdudiyyətlərlə qarşılıqlı əlaqəni həyata keçirən və onun cari vəziyyətini idarə edən ayrıca Manipulyator obyektindən istifadə etmək daha yaxşıdır. Fərqli formalarda Manipulyatorun alt sinfi olan müxtəlif manipulyatorlar olacaq. Manipulyator sinifinin nəticədə yaranan iyerarxiyası Şəkil sinfinin iyerarxiyasına paraleldir (ən azı qismən). Şəkil sinfi müştərilərə rəqəmə uyğun manipulyator yaratmağa imkan verən CreateManipulator zavod metodunu təqdim edir. Şəkilin alt sinifləri bu metodu ləğv edir ki, onlar üçün uyğun Manipulyator alt sinifini qaytarsın. Bunun əvəzinə, Şəkil sinfi CreateManipulator tətbiq edə bilər ki, o, Manipulator sinfinin standart nümunəsini qaytarsın və Şəkil alt sinifləri miras ala bilsin.
bu defoltdur.

Təsvir edilən prinsipə uyğun fəaliyyət göstərən bu forma sinifləri xüsusi manipulyatora ehtiyac duymur, buna görə də iyerarxiya
yalnız qismən paraleldir. Zavod metodunun hər ikisi arasındakı əlaqəni necə təyin etdiyinə diqqət yetirin
sinif iyerarxiyaları. Bu, hansı siniflərin birlikdə işləyə biləcəyi haqqında bilikləri ehtiva edir.

Budur diaqram:

Yenə də (nəticələr haqqında):

  1. Zavod metodları dizaynerin koda xüsusi proqram sinifləri qurmaq ehtiyacını aradan qaldırır.
  2. yarada bilərsiniz (istəsəniz) genişləndirilmiş obyektlər - mücərrəd Yaradıcının xüsusi tətbiqlərini ləğv etməyə imkan verir - zəruri hallarda bir sıra üsullar (fayl dialoqu ilə nümunədə olduğu kimi)
  3. Paralel iyerarxiyaların əlaqələri

İcra

Bu bölmədə icra xüsusiyyətlərini qeyd etməyə dəyər, bunlar aşağıdakılardır:

  • İcra üçün iki əsas hal var:
    1. yaradıcı sinfi mücərrəd olduqda
    2. Yaradan konkret (“müntəzəm”) sinif olduqda
    3. Yaxşı, hələ də qarışıq bir növ var - mücərrəd sinif standart tətbiqi ehtiva etdikdə
  • parametrli zavod üsulları- bu xüsusiyyət, ümumiyyətlə, zavod metodundan istifadə edərək, qəbul edilmiş parametrlərdən asılı olaraq müxtəlif növ məhsullar yarada biləcəyinizi nəzərdə tutur.
  • xüsusi icra dili ilə əlaqəli müxtəlif xüsusiyyətlər

Nümunə kodu

Məlum Proqramlar

Zavod üsulları hər yerdə tapılır - Əksər kitabxanalar və çərçivələr bu və ya digər şəkildə Fabrika Metodundan istifadə edir- xüsusilə ET++ kitabxanası

Əlaqədar nümunələr

Çox vaxt zavod üsullarından istifadə etməklə həyata keçirilir.

Mücərrəd fabrik təsvirindən Motivasiya bölməsindəki nümunə də zavod üsullarının nümunəsini göstərir.
Zavod üsulu nümunəsi çox vaxt daxili şablon metodları adlanır.

Prototiplərin Creator sinfindən alt siniflərə bölünməsinə ehtiyac yoxdur. Bununla belə, onlar tez-tez Məhsul sinfində Initialize əməliyyatına ehtiyac duyurlar.
Yaradıcı obyekti işə salmaq üçün Initialize-dən istifadə edir. Zavod
metod belə bir əməliyyat tələb etmir.

Zavod üsulu alt siniflərə yaradılan obyektlərin növünü dəyişməyə imkan verən supersinifdə obyektlər yaratmaq üçün ümumi interfeysi müəyyən edən generativ dizayn nümunəsidir.

Problem

Təsəvvür edin ki, siz yüklərin idarə edilməsi proqramı yaradırsınız. Əvvəlcə malların yalnız avtomobillərlə daşınmasını gözləyirsiniz. Beləliklə, bütün kodunuz Truck sinfinin obyektləri ilə işləyir.

Bir nöqtədə, proqramınız o qədər məşhur olur ki, okean daşıyıcıları sıraya düzülür və proqrama dəniz logistika dəstəyi əlavə etməyi xahiş edirlər.


Bütün kodlar artıq xüsusi siniflərə bağlıdırsa, yeni sinif əlavə etmək o qədər də asan deyil.

Əla xəbərdir, hə?! Bəs kod haqqında nə demək olar? Mövcud kodların əksəriyyəti ciddi şəkildə Yük maşını sinifləri ilə bağlıdır. Proqrama dəniz gəmilərinin siniflərini əlavə etmək üçün bütün proqramı qazmalı olacaqsınız. Üstəlik, daha sonra proqrama başqa bir nəqliyyat növü əlavə etmək qərarına gəlsəniz, bütün bu işlər təkrarlanmalı olacaq.

Nəticədə, avtomobilin sinfindən asılı olaraq bu və ya digər hərəkəti yerinə yetirən şərti ifadələrlə dolu dəhşətli kodla nəticələnəcəksiniz.

Həll

Fabrika metodu nümunəsi obyektləri birbaşa yeni operatordan istifadə etməklə deyil, xüsusi çağırmaqla yaratmağı təklif edir zavodüsul. Narahat olmayın, obyektlər hələ də new istifadə edərək yaradılacaq, lakin zavod üsulu bunu edəcək.


Alt siniflər yaratdıqları obyektlərin sinfini dəyişə bilər.

İlk baxışdan bu mənasız görünə bilər: biz sadəcə olaraq konstruktor çağırışını proqramın bir ucundan digər ucuna köçürdük. Ancaq indi yaratdığınız məhsulun növünü dəyişdirmək üçün alt sinifdə zavod metodunu ləğv edə bilərsiniz.

Bu sistemin işləməsi üçün bütün qaytarılan obyektlərin ümumi interfeysi olmalıdır. Alt siniflər eyni interfeysdən sonra müxtəlif siniflərin obyektlərini istehsal edə biləcəklər.


Bütün məhsul obyektlərinin ümumi interfeysi olmalıdır.

Məsələn, Yük maşını və Gəmi sinifləri çatdırılma metodu ilə Nəqliyyat interfeysini həyata keçirir. Bu siniflərin hər biri üsulu özünəməxsus şəkildə həyata keçirir: yük maşınları quruda, gəmilər isə dənizlə yük daşıyır. RoadLogistics sinifindəki zavod üsulu yük maşını obyektini, MarineLogistics sinfi isə gəmi obyektini qaytaracaq.


Bütün məhsullar ümumi interfeys tətbiq etdikcə, onların obyektləri müştəri kodunda dəyişdirilə bilər.

Zavod metodu müştəri üçün bu obyektlər arasında heç bir fərq yoxdur, çünki o, onlara bir növ mücərrəd Nəqliyyat kimi baxacaq. Onun üçün obyektin çatdırılma metodunun olması vacib olacaq, lakin onun necə işlədiyi vacib deyil.

Struktur



    Məhsul yaradıcının və onun alt siniflərinin yarada biləcəyi obyektlər üçün ümumi interfeysi müəyyən edir.

    Xüsusi Məhsullar müxtəlif məhsullar üçün kod ehtiva edir. Məhsullar icrada fərqlənəcək, lakin ümumi interfeysə malik olacaqlar.

    Yaradan yeni məhsul obyektlərini qaytarmalı olan zavod metodunu elan edir. Nəticə növünün məhsulların ümumi interfeysinə uyğun olması vacibdir.

    Çox vaxt zavod metodu bütün alt sinifləri fərqli şəkildə həyata keçirməyə məcbur etmək üçün mücərrəd elan edilir. Ancaq müəyyən bir standart məhsulu da qaytara bilər.

    Adına baxmayaraq, məhsulların yaradılmasını başa düşmək vacibdir deyil yaradıcının yeganə funksiyasıdır. O, adətən məhsulla işləmək üçün digər faydalı kodu ehtiva edir. Analogiya: böyük proqram təminatı şirkətinin proqramçı təlim mərkəzi ola bilər, lakin şirkətin əsas vəzifəsi proqramçılar yetişdirmək deyil, proqram məhsulları yaratmaqdır.

    Xüsusi Yaradıcılar müəyyən spesifik məhsullar istehsal edərək zavod üsulunu öz yolu ilə həyata keçirir.

    Zavod üsulu hər zaman yeni obyektlər yaratmalı deyil. Bəzi yaddaşdan və ya keşdən mövcud obyektləri qaytarmaq üçün yenidən yazıla bilər.

Psevdokod

Bu misalda Zavod üsuluəsas proqram kodunu xüsusi element siniflərinə bağlamadan platformalararası interfeys elementlərini yaratmağa kömək edir.


Platformalar arası dialoqun nümunəsi.

Zavod metodu dialoq sinifində elan edilir. Onun alt sinifləri müxtəlif əməliyyat sistemlərinə aiddir. Zavod üsulu sayəsində hər bir sistem üçün dialoq məntiqini yenidən yazmağa ehtiyac yoxdur. Alt siniflər, əsas kodun GUI pəncərələrini qurduğu düymələrin növlərini və digər elementləri dəyişdirərək, demək olar ki, bütün kodu əsas dialoqdan miras ala bilər.

Əsas dialoq sinfi ümumi proqramlaşdırma interfeysi vasitəsilə düymələrlə işləyir. Buna görə də, zavod metodu hansı düymələrin dəyişməsindən asılı olmayaraq, dialoq işləyəcək. Əsas sinif xüsusi düymə siniflərindən asılı deyil, hansı növ düymələrin yaradılmasına qərar vermək üçün onu alt siniflərə buraxır.

Bu yanaşma digər interfeys elementlərini yaratmaq üçün istifadə edilə bilər. Baxmayaraq ki, hər bir yeni element növü sizi Abstrakt Fabrikaya yaxınlaşdıracaq.

// Fabrika metodu nümunəsi proqramın // məhsul siniflərinin iyerarxiyasına malik olduğu halda tətbiq edilir. interfeys Button metod render() metodudur onClick(f) sinif WindowsButton həyata keçirir Button render(a, b) metodudur // Düyməni Windows üslubunda göstərin. metod onClick(f) // Düyməyə Windows hadisə idarəedicisini əlavə edin. class HTMLButton həyata keçirir Düymədir render (a, b) metodudur // Düymənin HTML kodunu qaytarın. metod onClick(f) // Düyməyə brauzer hadisəsi idarəedicisini əlavə edin. // Fabrikin baza sinfi. Qeyd edək ki, "zavod" sadəcə // sinif üçün əlavə roldur. Çox güman ki, // müxtəlif məhsulların yaradılmasını tələb edən bir növ iş məntiqinə malikdir. class Dialoq render() metodudur // Zavod metodundan istifadə etmək üçün // bu biznes məntiqinin // xüsusi məhsul siniflərindən asılı olmadığına əmin olmalısınız. Düymə ümumi // düymə interfeysidir, ona görə də hər şey yaxşıdır. Button okButton = createButton() okButton.onClick(closeDialog) okButton.render() // Biz bütün məhsul yaratma kodunu xüsusi metoda yerləşdiririk // "zavod" adlanır. abstrakt metod createButton() // Beton zavodları zavod metodunu ləğv edir və // ondan öz məhsullarını qaytarır. class WindowsDialog genişləndirir Dialoq metodudur createButton() qaytarır yeni WindowsButton() sinif WebDialoq genişləndirir Dialoq metodu createButton() metodu yaradır yeni HTMLButton() sinfi Tətbiq sahə dialoqudur: Dialoq // Proqramdan asılı olaraq xüsusi zavod yaradır // konfiqurasiya və ya mühit. metodu initialize() konfiqurasiya = readApplicationConfigFile() olarsa (config.OS == "Windows") sonra dialoq = yeni WindowsDialog() başqa halda (config.OS == "Veb"), sonra dialoq = new WebDialog() başqa yeni at İstisna("Xəta! Naməlum əməliyyat sistemi.") // Əgər bütün digər müştəri kodları fabriklər və // məhsullarla yalnız ümumi interfeys vasitəsilə qarşılıqlı əlaqədədirsə, o zaman // ilkin olaraq hansı fabrikin yaradılmasının əhəmiyyəti olmayacaq. main() metodu this.initialize() dialog.render()-dir.

Uyğunluq

Kodunuzun işləməli olduğu obyektlərin növləri və asılılıqları əvvəlcədən bilinmədikdə.

Zavod üsulu məhsulların istehsalı üçün kodu həmin məhsulları istifadə edən kodun qalan hissəsindən ayırır.

Bunun sayəsində istehsal kodu əsas birinə toxunmadan genişləndirilə bilər. Beləliklə, yeni bir məhsula dəstək əlavə etmək üçün yeni bir alt sinif yaratmalı və orada yeni məhsulun nümunəsini qaytararaq orada zavod metodunu təyin etməlisiniz.

İstifadəçilərə çərçivənizin və ya kitabxananızın hissələrini genişləndirməyə imkan vermək istədiyiniz zaman.

İstifadəçilər miras yolu ilə çərçivənizin siniflərini genişləndirə bilərlər. Bəs necə edə bilərsiniz ki, çərçivə standart siniflərdən deyil, bu yeni siniflərdən obyektlər yaratsın?

Həll istifadəçilərə yalnız istədiyiniz komponentləri deyil, həm də həmin komponentləri yaradan sinifləri genişləndirmək imkanı vermək olardı. Bunun üçün isə siniflərin yaradılması müəyyən edilə bilən xüsusi yaratma üsullarına malik olmalıdır.

Məsələn, tətbiqiniz üçün hazır UI çərçivəsindən istifadə edirsiniz. Ancaq burada problem var - standart düzbucaqlılar əvəzinə yuvarlaq düymələrə sahib olmaq lazımdır. Siz RoundButton sinfi yaradırsınız. Bəs əsas UIFramework sinfinə standart düymələr əvəzinə dairəvi düymələr yaratmağı necə deyə bilərsiniz?

Bunun üçün siz çərçivənin əsas sinfindən UIWithRoundButtons alt sinifini yaradırsınız, onda düymə yaratma metodunu (a la createButton) ləğv edirsiniz və orada düymə sinfinizin yaradılmasını daxil edirsiniz. Sonra standart UIFramework əvəzinə UIWithRoundButtons istifadə edin.

Yenilərini yaratmaq əvəzinə artıq yaradılmış obyektləri təkrar istifadə etməklə sistem resurslarına qənaət etmək istədiyiniz zaman.

Bu problem, adətən, verilənlər bazasına, fayl sisteminə və s.

Mövcud obyektləri yenidən istifadə etmək üçün neçə addım atmalı olduğunuzu təsəvvür edin:

  1. Birincisi, yaratdığınız bütün obyektləri saxlamaq üçün ortaq yaddaş yaratmalısınız.
  2. Yeni obyekt tələb edərkən siz anbara baxmaq və orada istifadə olunmamış obyektin olub-olmadığını yoxlamaq lazımdır.
  3. Və sonra onu müştəri koduna qaytarın.
  4. Ancaq pulsuz obyektlər yoxdursa, onu yaddaşa əlavə etməyi unutmadan yenisini yaradın.

Müştəri kodunu qarışdırmamaq üçün bütün bu kodu bir yerə qoymaq lazımdır.

Ən əlverişli yer obyekt konstruktoru olardı, çünki bütün bu yoxlamalar yalnız obyektlərin yaradılması zamanı lazımdır. Amma təəssüf ki, dizayner həmişə yaradır yeni obyektlər, o, mövcud nümunəni qaytara bilməz.

Bu o deməkdir ki, bizə həm mövcud, həm də yeni obyektləri qaytaracaq başqa metod lazımdır. Bu zavod üsulu olacaq.

İcra mərhələləri

    Bütün yaradılmış məhsulları ümumi interfeysə gətirin.

    Məhsul istehsal edən sinifdə boş bir zavod metodu yaradın. Qaytarma növü kimi məhsulun ümumi interfeysini təyin edin.

    Sonra sinif kodundan keçin və məhsul yaradan bütün bölgələri tapın. Bu bölmələri bir-bir zavod metoduna zənglərlə dəyişdirin, müxtəlif məhsullar yaratmaq üçün kodu ona köçürün.

    Hansı məhsulun yaradılmasına nəzarət etmək üçün zavod metoduna bir neçə parametr əlavə etməli ola bilərsiniz.

    Bu nöqtədə zavod üsulu çox güman ki, üzücü görünəcək. O, yaradılan məhsulun sinfini seçən böyük şərti operatordan ibarət olacaq. Ancaq narahat olmayın, biz bunu düzəltmək üzrəyik.

    Hər bir məhsul növü üçün bir alt sinif yaradın və içindəki zavod metodunu ləğv edin. Müvafiq məhsulu yaratmaq üçün kodu super sinifdən ora köçürün.

    Yaradılan məhsullar mövcud yaradıcı alt sinifləri üçün çox olarsa, müxtəlif məhsulların eyni alt sinif daxilində qaytarılmasına imkan verəcək parametrləri zavod metoduna daxil etməyi düşünə bilərsiniz.

    Məsələn, sizin Airmail və SurfaceMail alt sinifləri olan Mail sinifiniz və Təyyarə, Yük maşını və Qatar məhsul sinifləri var. Hava Təyyarələrə uyğundur, lakin Surface Mail üçün eyni anda iki məhsul var. Siz qatarlar üçün yeni poçt alt sinfi yarada bilərsiniz, lakin problemi həll etməyin başqa yolu var. Müştəri kodu arqumenti yaradılan məhsulun növünə nəzarət edən SurfaceMail zavod metoduna ötürə bilər.

    Bütün hərəkətlərdən sonra zavod üsulu boşdursa, onu mücərrəd edə bilərsiniz. İçində bir şey varsa, fərq etməz, bu onun standart tətbiqi olacaqdır.

    Digər tərəfdən, zavod üsulu miras üzərində qurulur, lakin kompleks başlatma tələb etmir.

    Zavod metodu Şablon Metodunun xüsusi halı hesab edilə bilər. Bundan başqa, Zavod üsulu ilə tez-tez böyük bir sinif hissəsi Şablon üsulları.

    Zavod metodunun təsviri

    Fabrika metodu (həmçinin Virtual Konstruktor kimi tanınır) alt sinifləri sinif nümunələrini yaratmaq üçün interfeyslə təmin edən generativ dizayn nümunəsidir. Yaradılma zamanı varislər hansı sinfin yaradılacağını müəyyən edə bilərlər. Başqa sözlə, Fabrika obyektlərin yaradılmasını ana sinfin nəsillərinə həvalə edir. Bu, proqram kodunda xüsusi siniflərdən deyil, mücərrəd obyektləri daha yüksək səviyyədə manipulyasiya etməyə imkan verir.

    Obyekt yaratmaq üçün interfeysi müəyyən edir, lakin hansı sinfin yaradılmasına qərar vermək üçün onu alt siniflərə buraxır. Zavod metodu sinfə alt siniflərin yaradılmasını həvalə etməyə imkan verir. Zaman istifadə olunur:

    • sinif hansı alt siniflərin hansı obyektlərini yaratmalı olduğunu əvvəlcədən bilmir.
    • sinif elə qurulmuşdur ki, onun yaratdığı obyektlər alt siniflər tərəfindən təyin olunsun.
    • sinif öz vəzifələrini bir neçə köməkçi alt sinifdən birinə həvalə edir və plan bu məsuliyyətləri hansı sinfin üzərinə götürdüyünə dair bilikləri lokallaşdırmaqdır.

    Struktur

    • Məhsul- məhsul
      • abstrakt üsulla yaradılmış obyektlərin interfeysini müəyyən edir;
    • Beton Məhsulu- xüsusi məhsul
      • interfeysini həyata keçirir Məhsul;
    • Yaradan- yaradan
      • tipli obyekti qaytaran zavod metodunu elan edir Məhsul. Bu metodun "defolt" tətbiqi də ola bilər;
      • tipli obyekt yaratmaq üçün zavod metodunu çağıra bilər Məhsul;
    • Beton Yaradıcısı- xüsusi yaradıcı
      • fabrik metodunu ləğv edir ki, o, sinif obyektini yaradır və qaytarır Beton Məhsulu.