Як вы памятаеце розніцу паміж абстрактнымі фабрычнымі ўзорамі і завадскімі метадамі ў мадэлях дызайну?


адказ 1:

Дызайн завода:

  • Падпадае пад Шаблон Creative Design Pattern.Factory паказваецца, што стварэнне аб'екта апрацоўваецца іншым класам з выкарыстаннем тыпу ўводу.

Перавагі:

  • Гэта дае магчымасць свабоднай муфты.

Калі выкарыстоўваецца шаблон дызайну завода?

  • Фабрычная канструкцыя выкарыстоўваецца, калі ў нас ёсць суперкласс з некалькімі падкласамі і нам трэба вярнуць адзін з падкласаў на аснове ўваходных дадзеных. Прыклад: калі ў рэстаране падаюць вегетарыянскую, негетарыянскую і італьянскую ежу. Разглядайце VegFood, NonVegFood і ItalianFood як тры класы, вышэйшым класам якіх з'яўляецца ежа. Калі кліент пытаецца "Veg", заводскі метад вяртае клас "VegFood".

Напрыклад:

Крок 1. Стварыце абстрактны клас "Ежа" з дзвюма пераменнымі, якія называюцца "billPerPerson" і "items".

грамадская ежа абстрактнага класа {абаронены двайны billPerPerson; абароненыя наборы прадметаў; грамадская ежа (двайны billPerPerson) {this.billPerPerson = billPerPerson; this.items = новы HashSet <> (); } публічны двайны getBill () {return billPerPerson; } публічны набор getItems () {return article; }}

Крок 2. Стварыце канкрэтныя класы, якія пашыраюць абстрактны клас "ежа"

грамадскі клас VegFood распаўсюджвае ежу {public VegFood () {super (100); items.add ("Бяздзейнічае"); items.add ("Доса"); items.add ("Вада"); }} грамадскі клас NonVegFood распаўсюджвае ежу {public NonVegFood () {super (120); items.add ("Бірыяні"); items.add ("Курыца 65"); }}

Крок 3: Стварыце FoodServer, які з'яўляецца заводскім класам, каб стварыць аб'ект для бетону, абапіраючыся на наступную інфармацыю:

грамадскі клас FoodServer {public static Food getFood (string foodType) {if (foodType.equals ("veg")) {return new VegFood (); } else if (foodType.equals ("non veg")) {return new NonVegFood (); } else {System.out.println ("Мы не абслугоўваем" + foodType); вярнуць нуль; }}}

Крок 4: Галоўны клас "пакупнік", каб атрымаць неабходную ежу ў залежнасці ад тыпу ежы.

грамадскі кліент {public static void main (String [] args) {Food customer1Food = FoodServer.getFood ("veg"); System.out.println ("Customer1"); System.out.println ("Пункты:" + customer1Food.getItems (). ToString ()); System.out.println ("Рахунак:" + customer1Food.getBill ()); Food customer2Food = FoodServer.getFood ("не гародніна"); System.out.println ("Customer1"); System.out.println ("Элементы:" + customer2Food.getItems (). ToString ()); System.out.println ("Рахунак:" + customer2Food.getBill ()); }}

Абстрактны заводскі ўзор дызайну:

  • Падпадае пад шаблон творчага дызайну. Ён забяспечвае інтэрфейс для стварэння сямействаў звязаных альбо залежных аб'ектаў без указання іх канкрэтных класаў. Абстрактныя заводскія ўзоры - гэта супер завод, які вяртае лепшую фабрыку на аснове ўкладзеных дадзеных. Ён дзейнічае як фабрыка фабрык і пазбаўляе заказчыка ведаў, якія фабрыкі будуць вернутыя.

Прыклад з рэальнага жыцця:

  • Уявіце сабе вялікую фабрыку для вырабу мыла. Не ўсе мыльныя вырабы вырабляюцца на гэтай фабрыцы. Існуе мноства падзаводаў, якія вырабляюць "мыльныя батончыкі", "мыльную ўпакоўку" і г.д. Усё сабрана на галоўнай фабрыцы.

Калі выкарыстоўваецца абстрактная канструкцыя завода?

  • Кліент павінен быць незалежным ад таго, як і для якога аб'екта класа створаны аб'екты. Гэта карысна, калі аб'ект трэба стварыць з сямейства класаў.

УВАГА: Гэта можа збянтэжыць. Праверце відэа, якое я ўклаў у ніжняй частцы гэтай старонкі.

Напрыклад:

Крок 1:

  • Стварыце інтэрфейс пад назвай "Курс".
курс публічнага інтэрфейсу {public String getCourseName (); }

Крок 2:

  • Стварыце канкрэтныя класы, якія рэалізуюць інтэрфейс "Курс".
Public Class ProgrammingCourse рэалізуе курс {@Override public String getCourseName () {return "Java"; }} публічны клас NonProgrammingCourse рэалізуе курс {@Override public String getCourseName () {return "DSP"; }}

Крок 3:

  • Стварыце інтэрфейс пад назвай "Крыніца".
крыніца публічнага інтэрфейсу {public string getSourceName (); }

Крок 4:

  • Стварыце канкрэтныя класы, якія рэалізуюць інтэрфейс "крыніца".
грамадскі клас рэалізаваны ў аўтаномным рэжыме {@Override public String getSourceName () {return "кнігі"; }} Інтэрнэт-рэалізуецца крыніца публічнага класа {@override public string getSourceName () {return "YouTube"; }}

Крок 5:

  • Стварыце абстрактны клас "SourceCourseFactory".
публічны абстрактны клас SourceCourseFactory {адкрыты абстрактны крыніца getSource (String sourceType); публічны абстрактны курс getCourse (String courseType); }

Крок 6:

  • Стварыце заводскі клас CourseFactory, які пашырае SourceCourseFactory.
адкрыты клас CourseFactory пашырае SourceCourseFactory {@Override public Source getSource (String sourceType) {return null; } @Override public Course getCourse (String courseType) {if (courseType.equalsIgnoreCase ("Праграмаванне")) {вярнуцца новы ProgrammingCourse (); } else if (courseType.equalsIgnoreCase ("не праграмуе")) {return new NonProgrammingCourse (); } else {return null; }}}

Крок 7:

  • Стварыце заводскі клас SourceFactory, які пашырае SourceCourseFactory.
публічны клас SourceFactory пашырае SourceCourseFactory {@Override public Source getSource (String sourceType) {if (sourceType.equalsIgnoreCase ("Інтэрнэт")) {return new Online (); } else if (sourceType.equalsIgnoreCase ("у ​​аўтаномным рэжыме")) {return new Offline (); } else {return null; }} @ Override public Course getCourse (String courseType) {return null; }}

Крок 8:

  • Стварыце галоўны клас, які выклікае клас "Абстрактная фабрыка", каб атрымаць сапраўдны аб'ект "Фабрычны клас", а затым выкарыстоўвайце гэты аб'ект для іншых аперацый.
публічны клас ExampleMain {public static void main (String [] args) {SourceCourseFactory course = FactoryCreator.getSourceCourseFactory ("курс"); System.out.println (course.getCourse ("праграмаванне"). GetCourseName ()); SourceCourseFactory source = FactoryCreator.getSourceCourseFactory ("крыніца"); System.out.println (source.getSource ("Інтэрнэт"). GetSourceName ()); }}