Читаоци попут вас помажу у подршци МУО. Када обавите куповину користећи везе на нашем сајту, можда ћемо зарадити провизију за партнере. Опширније.

Фабрички (или фабрички метод) образац дизајна је специјализован за делегирање и инкапсулацију. Овај образац омогућава суперкласи да одложи инстанцирање на подкласе. То је зато што је класа која садржи примарни образац фабричке методе апстрактна.

Оригинална верзија фабричке методе преузима облик неспроведене методе јер не зна производ који ће креирати. Фабрички метод може знати да ствара неки производ, али не зна специфичне карактеристике производа који ће створити. Ово знање је доступно само одговарајућим подкласама. Стога, одговорност за имплементацију фабричког метода и креирање одговарајућих објеката је искључиво подкласа.

Имплементација Фацтори Десигн Паттерна у Јави

Овај чланак користи пример апликације за генерисање извештаја са повратним информацијама. Ова апликација користи различите врсте повратних информација које компанија добија (за нову ужину) за креирање специфичних извештаја (користећи фабрички метод). Стога ће фабрички образац креирати специфичне повратне информације (или извештај о повратним информацијама), користећи следећу примарну класу производа као основу:

јавностиапстрактанкласаПовратна информација{

приватни Низ ревиеверНаме;
приватни Низ ревиевМессаге;
приватниинт ревиевРатингс;

јавностиПовратна информација(Стринг ревиеверНаме, Стринг ревиевМессаге, инт рецензија Оцене){
ово.ревиеверНаме = ревиеверНаме;
ово.ревиевМессаге = ревиевМессаге;
ово.ревиевРатингс = ревиевРатингс;
}

јавности Низ гетРевиеверНаме(){
повратак ревиеверНаме;
}
јавностипразнинасетРевиеверНаме(Стринг ревиеверНаме){
ово.ревиеверНаме = ревиеверНаме;
}
јавности Низ гетРевиевМессаге(){
повратак ревиевМессаге;
}
јавностипразнинасетРевиевМессаге(Порука о прегледу стринга){
ово.ревиевМессаге = ревиевМессаге;
}
јавностиинтгетРевиевРатингс(){
повратак ревиевРатингс;
}
јавностипразнинасетРевиевРатингс(инт рецензија Оцене){
ово.ревиевРатингс = ревиевРатингс;
}
}

Свака повратна информација ће имати три обавезна својства, име рецензента, поруку рецензије и оцену (од један до пет) за нову ужину. Различите врсте повратних информација које ће компанија добити долазиће са једног од три канала:

Е-маил Феедбацк Цласс

јавностикласаЕмаилФеедбацкпротежеПовратна информација{

приватни Низ ревиеверЕмаил;

јавни емаилФеедбацк(Низ Име рецензента, Низ ревиевМессаге, инт ревиевРатингс, Низ рецензентИмејл) {
супер(ревиеверНаме, ревиевМессаге, ревиевРатингс);
ово.ревиеверЕмаил = ревиеверЕмаил;
}
јавности Низ гетРевиеверЕмаил(){
повратак ревиеверЕмаил;
}
јавностипразнинасетРевиеверЕмаил(Имејл рецензента стринга){
ово.ревиеверЕмаил = ревиеверЕмаил;
}
}

Маил Феедбацк Цласс

јавностикласаМаилФеедбацкпротежеПовратна информација{

приватни Низ адреса пошиљаоца;

јавна поштаФеедбацк(Низ Име рецензента, Низ ревиевМессаге, инт ревиевРатингс, Низ адреса пошиљаоца) {
супер(ревиеверНаме, ревиевМессаге, ревиевРатингс);
ово.ретурнАддресс = ретурнАддресс;
}

јавности Низ гетРетурнАддресс(){
повратак адреса пошиљаоца;
}

јавностипразнинасетРетурнАддресс(Стринг ретурнАддресс){
ово.ретурнАддресс = ретурнАддресс;
}
}

Час повратних информација друштвених медија

јавностикласаСоциалМедиаФеедбацкпротежеПовратна информација{

приватни Низ ревиеверХандле;

јавни друштвени медијиФеедбацк(Низ Име рецензента, Низ ревиевМессаге, инт ревиевРатингс, Низ ревиеверХандле) {
супер(ревиеверНаме, ревиевМессаге, ревиевРатингс);
ово.ревиеверХандле = ревиеверХандле;
}

јавности Низ гетРевиеверХандле(){
повратак ревиеверХандле;
}

јавностипразнинасетРевиеверХандле(Стринг ревиеверХандле){
ово.ревиеверХандле = ревиеверХандле;
}
}

Приметићете да свака подкласа повратних информација има јединствено својство. То значи да ћете морати да креирате извештај за сваки тип повратних информација користећи најмање једно својство које је јединствено за тај тип.

Једноставна фабрика

Једноставна фабрика је популаран приступ коришћењу обрасца фабричког дизајна. Овај приступ подразумева груписање свих различитих повратних информација (или производа) у методу (једноставну фабрику) и избор одговарајуће повратне информације на основу параметра.

јавностикласаФеедбацкРепортФацтори{

јавности Повратна информација макеФеедбацк(Стринг феедбацкТипе){
Повратне информације = нула;

ако(феедбацкТипе.екуалс("е-пошта")) {
повратна информација = Нова ЕмаилФеедбацк();
}другоако (феедбацкТипе.екуалс("Пошта")) {
повратна информација = Нова МаилФеедбацк();
}другоако (феедбацкТипе.екуалс("друштвено")) {
повратна информација = Нова СоциалМедиаФеедбацк();
}
повратак повратна информација;
}
}

Међутим, једноставан фабрички приступ није образац фабричког дизајна, нити је образац дизајна. То је више као концепт дизајна.

Фабрички метод

Фабрички метод је прави приказ шаблона дизајна. Користећи фабричку методу, реформисана ФеедбацкРепортФацториЈава класа сада ће садржати следећи код:

јавностиапстрактанкласаФеедбацкРепортФацтори{
јавностиапстрактанпразнинамакеФеедбацкРепорт(повратне информације);
}

Можете дефинисати структуру обрасца фабричког дизајна помоћу следећег дијаграма класа:

Из горњег дијаграма видећете да ће апстрактна класа (или интерфејс) садржати апстрактну верзију фабричке методе. Дакле, конкретне фабричке класе које проширују апстрактну класу ће имплементирати фабрички метод, користећи својства која су јединствена за производ који жели да креира. Такође треба да имате на уму да свака класа фабрике бетона треба да створи један или више производа.

Узорак апликације има три повезана, али јединствена производа. Сваки тип повратне информације има најмање једно јединствено својство. Дакле, апликација ће морати да има три фабрике бетона за изградњу сваког производа.

Фабрика повратних информација путем е-поште

јавностикласаЕмаилФеедбацкРепортпротежеФеедбацкРепортФацтори{

ЕмаилФеедбацк феедбацк;

@Прегазити
јавностипразнинамакеФеедбацкРепорт(повратне информације){

ово.феедбацк = (ЕмаилФеедбацк) повратне информације;

Систем.оут.принтлн("\нРепортЗаПовратна информацијаВиаЕмаил" +
"\нИме рецензента: " +ово.феедбацк.гетРевиеверНаме() +
"\нПовратне информације: " + ово.феедбацк.гетРевиевМессаге() +
"\нОцене: " + ово.феедбацк.гетРевиевРатингс() +
"\нЕмал Адреса: " + ово.феедбацк.гетРевиеверЕмаил());
}
}

Фабрика повратних информација путем поште

јавностикласаМаилФеедбацкРепортпротежеФеедбацкРепортФацтори{
МаилФеедбацк феедбацк;

@Прегазити
јавностипразнинамакеФеедбацкРепорт(повратне информације){
ово.феедбацк = (МаилФеедбацк) повратне информације;

Систем.оут.принтлн("\нРепортЗаПовратна информацијаВиаПошта" +
"\нИме рецензента: " +ово.феедбацк.гетРевиеверНаме() +
"\нПовратне информације: " + ово.феедбацк.гетРевиевМессаге() +
"\нОцене: " + ово.феедбацк.гетРевиевРатингс() +
"\нПоштанска адреса: " + ово.феедбацк.гетРетурнАддресс());
}
}

Фабрика повратних информација на друштвеним мрежама

јавностикласаСоциалМедиаФеедбацкРепортпротежеФеедбацкРепортФацтори{
СоциалМедиаФеедбацк повратне информације;

@Прегазити
јавностипразнинамакеФеедбацкРепорт(повратне информације){
ово.феедбацк = (СоциалМедиаФеедбацк) повратне информације;

Систем.оут.принтлн("\нРепортЗаПовратна информацијаВиаСоциалМедији" +
"\нИме рецензента: " + ово.феедбацк.гетРевиеверНаме() +
"\нПовратне информације: " + ово.феедбацк.гетРевиевМессаге() +
"\нОцене: " + ово.феедбацк.гетРевиевРатингс() +
"\нУправљање друштвеним медијима рецензента: " + ово.феедбацк.гетРевиеверХандле());
}
}

Тестирање узорка апликације

Сада можете да користите одговарајуће фабричке методе да направите минијатурне извештаје о повратним информацијама добијеним са различитих канала. Можете тестирајте апликацију користећи ЈУнит, или можете креирати класу драјвера:

јавностикласаГлавни{

јавностистатичнапразнинаглавни(Стринг[] аргументи){
Повратне информације = Нова емаилФеедбацк("Ницк", “Одличан производ!”, 5, "ницк@емаил.цом");
Феедбацк феедбацк2 = Нова МаилФеедбацк("јохн", "Производ је добар, али није нешто што бих редовно куповао", 4, "Прва улица");
Феедбацк феедбацк3 = Нова СоциалМедиаФеедбацк("Јане", "Није за мене", 2, "@јанеи");

ФеедбацкРепортФацтори фацтори = Нова ЕмаилФеедбацкРепорт();
ФеедбацкРепортФацтори фацтори2 = Нова МаилФеедбацкРепорт();
ФеедбацкРепортФацтори фацтори3 = Нова СоциалМедиаФеедбацкРепорт();

фабрика.макеФеедбацкРепорт(повратна информација);
фабрика2.макеФеедбацкРепорт(феедбацк2);
фабрика3.макеФеедбацкРепорт(повратне информације3);
}

Класа Маин изнад користи одговарајуће фабрике за креирање три извештаја, производећи следеће излазне податке у конзоли:

Предности коришћења обрасца фабричког дизајна

Фабрички образац дизајна промовише флексибилност дизајна, где користите интерфејсе (или апстрактне класе) за креирање конкретних класа. Такође промовише скалабилност кроз полиморфизам, дозвољавајући новим класама да имплементирају постојећи интерфејс како се апликација шири.

Када користите фабрички образац дизајна, користите два важна принципа дизајна: отворено-затворено и инверзију контроле (ИоЦ).