Читатели като вас помагат в подкрепа на MUO. Когато правите покупка чрез връзки на нашия сайт, ние може да спечелим комисионна за партньор. Прочетете още.

Фабричният (или фабричният метод) модел на проектиране е специализиран в делегирането и капсулирането. Този модел позволява на суперкласа да отложи инстанцирането на подкласове. Това е така, защото класът, който съдържа основния фабричен метод, е абстрактен.

Оригиналната версия на фабричния метод приема формата на неимплементиран метод, защото не познава продукта, който ще създаде. Фабричният метод може да знае, че създава някакъв продукт, но не знае специфичните характеристики на продукта, който ще създаде. Това знание е достъпно само за съответните подкласове. Следователно отговорността за прилагане на фабричния метод и създаване на подходящи обекти е единствено на подклас.

Внедряване на Factory Design Pattern в Java

Тази статия използва примерно приложение за генериране на отчет за обратна връзка. Това приложение използва различните видове обратна връзка, която компанията получава (за нова закуска), за да създаде конкретни отчети (използвайки фабричния метод). Следователно фабричният модел ще създаде специфична обратна връзка (или отчет за обратна връзка), използвайки следния първичен продуктов клас като база:

instagram viewer

публиченабстрактнокласОбратна връзка{

частен низ име на рецензент;
частен низ reviewMessage;
частенвътр прегледОценки;

публиченОбратна връзка(String reviewerName, String reviewMessage, вътр прегледОценки){
това.reviewerName = име на рецензент;
това.reviewMessage = съобщение за преглед;
това.reviewRatings = reviewRatings;
}

публичен низ getReviewerName(){
връщане име на рецензент;
}
публиченневалиденsetReviewerName(Име на рецензент на низ){
това.reviewerName = име на рецензент;
}
публичен низ getReviewMessage(){
връщане reviewMessage;
}
публиченневалиденsetReviewMessage(Съобщение за преглед на низ){
това.reviewMessage = съобщение за преглед;
}
публиченвътрgetReviewRatings(){
връщане прегледОценки;
}
публиченневалиденsetReviewRatings(вътр прегледОценки){
това.reviewRatings = reviewRatings;
}
}

Всяка обратна връзка ще има три задължителни свойства, име на рецензент, съобщение за рецензия и числова оценка (от едно до пет) за новата закуска. Различните видове обратна връзка, която компанията ще получи, ще идват от един от трите канала:

Клас за обратна връзка по имейл

публиченкласEmailFeedbackсе простираОбратна връзка{

частен низ рецензент имейл;

публичен EmailFeedback(низ име на рецензент, низ reviewMessage, int reviewRatings, низ имейл на рецензент) {
супер(име на рецензент, съобщение за рецензия, оценки на рецензия);
това.reviewerEmail = имейл на рецензент;
}
публичен низ getReviewerEmail(){
връщане рецензент имейл;
}
публиченневалиденsetReviewerEmail(Имейл на рецензент на низ){
това.reviewerEmail = имейл на рецензент;
}
}

Клас за обратна връзка по пощата

публиченкласMailFeedbackсе простираОбратна връзка{

частен низ адрес за връщане;

обществен MailFeedback(низ име на рецензент, низ reviewMessage, int reviewRatings, низ адрес за връщане) {
супер(име на рецензент, съобщение за рецензия, оценки на рецензия);
това.returnAddress = върнат адрес;
}

публичен низ getReturnAddress(){
връщане адрес за връщане;
}

публиченневалиденsetReturnAddress(Низ за връщане на адрес){
това.returnAddress = върнат адрес;
}
}

Клас за обратна връзка в социалните медии

публиченкласSocialMediaFeedbackсе простираОбратна връзка{

частен низ reviewerHandle;

обществена обратна връзка в социалните медии (низ име на рецензент, низ reviewMessage, int reviewRatings, низ reviewerHandle) {
супер(име на рецензент, съобщение за рецензия, оценки на рецензия);
това.reviewerHandle = reviewerHandle;
}

публичен низ getReviewerHandle(){
връщане reviewerHandle;
}

публиченневалиденsetReviewerHandle(String reviewerHandle){
това.reviewerHandle = reviewerHandle;
}
}

Ще забележите, че всеки подклас за обратна връзка има уникално свойство. Това означава, че ще трябва да създадете отчета за всеки тип обратна връзка, като използвате поне едно свойство, което е уникално за този тип.

Простата фабрика

Простата фабрика е популярен подход за използване на модела на фабричен дизайн. Този подход включва групиране на всички различни обратни връзки (или продукти) в метод (простата фабрика) и избиране на подходящата обратна връзка въз основа на параметър.

публиченкласFeedbackReportFactory{

публичен Обратна връзка makeFeedback(Тип обратна връзка на низ){
Обратна връзка = нула;

ако(feedbackType.equals("електронна поща")) {
обратна връзка = нов EmailFeedback();
}другоако (feedbackType.equals("поща")) {
обратна връзка = нов MailFeedback();
}другоако (feedbackType.equals("социален")) {
обратна връзка = нов SocialMediaFeedback();
}
връщане обратна връзка;
}
}

Простият фабричен подход обаче не е моделът на фабричния дизайн, нито е модел на проектиране. Това е по-скоро като дизайнерска концепция.

Фабричният метод

Фабричният метод е истинското представяне на модела на проектиране. Използвайки фабричния метод, реформираният FeedbackReportFactoryJava клас сега ще съдържа следния код:

публиченабстрактнокласFeedbackReportFactory{
публиченабстрактноневалиденmakeFeedbackReport(Обратна връзка);
}

Можете да дефинирате структурата на шаблона за фабричен дизайн със следната класова диаграма:

От диаграмата по-горе ще видите, че абстрактен клас (или интерфейс) ще съдържа абстрактна версия на фабричния метод. И така, конкретните фабрични класове, които разширяват абстрактния клас, ще реализират фабричния метод, използвайки свойства, които са уникални за продукта, който иска да създаде. Трябва също така да имате предвид, че всеки бетонен фабричен клас трябва да създаде един или повече продукти.

Примерното приложение има три свързани, но уникални продукта. Всеки тип обратна връзка има поне едно уникално свойство. Така че приложението ще трябва да има три бетонни фабрики за изграждане на всеки продукт.

Фабрика за обратна връзка по имейл

публиченкласEmailFeedbackReportсе простираFeedbackReportFactory{

EmailFeedback обратна връзка;

@Override
публиченневалиденmakeFeedbackReport(Обратна връзка){

това.feedback = (EmailFeedback) обратна връзка;

Система.вън.println("\nОтчетЗаОбратна връзкаЧрезелектронна поща" +
"\nИме на рецензент: " +това.feedback.getReviewerName() +
"\nОбратна връзка: " + това.feedback.getReviewMessage() +
"\nОценки: " + това.feedback.getReviewRatings() +
"\nEmal адрес: " + това.feedback.getReviewerEmail());
}
}

Фабрика за обратна връзка по пощата

публиченкласMailFeedbackReportсе простираFeedbackReportFactory{
MailFeedback обратна връзка;

@Override
публиченневалиденmakeFeedbackReport(Обратна връзка){
това.feedback = (MailFeedback) обратна връзка;

Система.вън.println("\nОтчетЗаОбратна връзкаЧрезпоща" +
"\nИме на рецензент: " +това.feedback.getReviewerName() +
"\nОбратна връзка: " + това.feedback.getReviewMessage() +
"\nОценки: " + това.feedback.getReviewRatings() +
"\nПощенски адрес: " + това.feedback.getReturnAddress());
}
}

Фабрика за обратна връзка в социалните медии

публиченкласSocialMediaFeedbackReportсе простираFeedbackReportFactory{
SocialMediaFeedback обратна връзка;

@Override
публиченневалиденmakeFeedbackReport(Обратна връзка){
това.feedback = (SocialMediaFeedback) обратна връзка;

Система.вън.println("\nОтчетЗаОбратна връзкаЧрезСоциалниМедия" +
"\nИме на рецензент: " + това.feedback.getReviewerName() +
"\nОбратна връзка: " + това.feedback.getReviewMessage() +
"\nОценки: " + това.feedback.getReviewRatings() +
"\nРецензент за социални медии: " + това.feedback.getReviewerHandle());
}
}

Тестване на Примерното приложение

Сега можете да използвате съответните фабрични методи, за да правите миниатюрни отчети за обратната връзка, получена от различните канали. Можеш тествайте приложението с помощта на JUnit, или можете да създадете клас драйвер:

публиченкласОсновен{

публиченстатиченневалиденосновен(Низ [] аргументи){
Обратна връзка = нов EmailFeedback("ник", „Страхотен продукт!“, 5, "[email protected]");
Обратна връзка обратна връзка2 = нов MailFeedback("Джон", „Продуктът е добър, но не е нещо, което бих купувал редовно“, 4, "първа улица");
Обратна връзка обратна връзка3 = нов SocialMediaFeedback("Джейн", "Не е за мен", 2, "@janey");

FeedbackReportFactory фабрика = нов EmailFeedbackReport();
FeedbackReportFactory factory2 = нов MailFeedbackReport();
FeedbackReportFactory factory3 = нов SocialMediaFeedbackReport();

фабрика.makeFeedbackReport(обратна връзка);
фабрика2.makeFeedbackReport(обратна връзка2);
фабрика3.makeFeedbackReport(обратна връзка3);
}

Основният клас по-горе използва съответните фабрики, за да създаде три отчета, създавайки следния изход в конзолата:

Предимства от използването на шаблона за фабричен дизайн

Фабричният модел на проектиране насърчава гъвкавостта на дизайна, където използвате интерфейси (или абстрактни класове), за да създавате конкретни класове. Той също така насърчава мащабируемостта чрез полиморфизъм, като позволява на нови класове да внедряват съществуващия интерфейс, докато приложението се разширява.

Когато използвате фабричния модел на проектиране, вие използвате два важни принципа на проектиране: отворено-затворено и инверсия на контрола (IoC).