design patterns java
В този урок ще обсъдим дизайнерски модели в Java. Ще изучаваме модели на Singleton, Factory и Builder с примери и предимства:
Когато решаваме конкретен проблем, можем да го решим по-ефективно, ако имаме вече определени най-добри практики. Това наистина ще ни помогне да следваме тези най-добри практики и да разработим по-надеждни решения.
Тези най-добри практики които могат да се използват за развитие добре доказани решения за решаване на проблеми се наричат „ Модели за дизайн ”. Опитните разработчици на OOP софтуер използват дизайнерски модели за решаване на конкретни задачи.
=> Погледнете тук ръководството за начинаещи Java
Какво ще научите:
- Проектиране на модели в Java
- Единичен модел в Java
- Фабричен модел в Java
- Модел на строител в Java
- Заключение
Проектиране на модели в Java
За пръв път дизайнерските модели са измислени от Кристофър Александър през 1977 г. Но по-късно четирима разработчици, а именно Ерих Гама, Ричард Хелм, Джон Влисидес и Ралф Джонсън, написаха книга, озаглавена „ Банда от модели с четири дизайна, елементи от обектно-ориентиран софтуер за многократна употреба ”През 1995г.
Оттогава всички дизайнерски модели стават известни като „ Банда от четири дизайнерски модела ”.
създаване на java проект в затъмнение
Шаблоните за проектиране са независими от всеки език за програмиране, тъй като се използват за решаване на често срещани обектно-ориентирани проблеми при проектирането и не се ограничават само до определен език за програмиране. Така че по принцип това е идея, а не изпълнение.
По този начин, използвайки дизайнерски модели, можем да разработим програми, които са по-ефективни, гъвкави, поддържаеми и многократно използвани.
Предимства на дизайнерските модели
По-долу са изброени някои от предимствата на използването на дизайнерски модели в нашите приложения:
- Моделите за проектиране могат да се използват многократно и могат да се използват от множество проекти.
- Можем да дефинираме системната архитектура, използвайки дизайнерски модели.
- Дизайнерските модели осигуряват прозрачност на дизайна на приложението.
- Моделите на дизайна вече са добре тествани и доказани, за да можем да ги използваме без притеснения.
- Моделите на проектиране ни позволяват да изграждаме по-добри системи и също така осигуряват яснота на системната архитектура.
Кога да се използват дизайнерски модели
И така, кога трябва точно да използваме дизайнерските модели?
Обикновено използваме модел на проектиране по време на първоначалната фаза на анализ и изисквания на SDLC (жизнен цикъл на разработката на софтуер). Когато се използва по време на фазата на анализ и изискване на SDLC, тя предоставя повече информация за тази фаза. Java вътрешно поддържа дизайнерски модели.
Моделите за проектиране в Java са категоризирани, както следва:
Що се отнася до този урок, ние се интересуваме само от модели на креативен дизайн.
Креативните дизайнерски модели са класифицирани по-нататък, както следва:
В този урок ще обсъдим следните модели на проектиране:
- Модел на единичен дизайн
- Шаблон за фабричен дизайн
- Конструкторски модел на строител
Нека започнем с един модел на дизайн в Java.
Препоръчително четене = >> Проектирайте модели за приложения, базирани на колба
Единичен модел в Java
Единичният модел е вид творчески модел в Java. Единичният модел е модел на проектиране, при който във виртуалната машина Java присъства само един екземпляр на клас. Единичен клас (реализиращ единичен модел) трябва да осигури глобална точка за достъп, за да получи екземпляра на класа.
С други думи, единичен модел ограничава инстанцирането на клас. Единичният модел се използва при изпълнението на регистратора за приложения. Той се използва и при изпълнение на пул от нишки или кеш.
Класовете Java, java.awt.Desktop и java.lang.runtime използвайте и единичен шаблон.
Предимства
- Тъй като се използва само един екземпляр на сингълтон класа, ние спестяваме памет.
- Също така осигурява повторна употреба, тъй като същият обект-единица се използва отново и отново.
Сега да преминем към изпълнението на сингълтън шаблона.
Прилагане на шаблона Singleton
Както вече споменахме, модел на единичен дизайн ограничава класа само с един екземпляр и този екземпляр получава глобална точка за достъп. Това бяха всички класове, които се отнасят до един и същ обект отново и отново.
Следващата UML диаграма обяснява модела на Singleton.
Както показва горната UML диаграма, един клас има дефиниран единичен екземпляр и ние го достъпваме по метода getInstance (). Така че фабрика за единичен модел, която отговаря за създаването на обекти, използва метода getInstance за връщане на същия обект (който е там в класа) отново и отново.
И така, как да приложим Singleton Pattern в програма?
Създаваме сингълтон клас и имаме неговия конструктор като “private”, така че класът да не може да бъде създаден. След това създаваме частен екземпляр на този единичен клас вътре в самия клас. Тогава имаме специален публичен метод getInstance (), който връща единичен обект във външния свят.
Това изпълнение на този сингълтон клас, както е обяснено по-горе, е показано в Java програмата по-долу.
class SingletonObject { //create an object of SingletonObject private static SingletonObject instance = new SingletonObject(); //private constructor so that we cannot instantiate the class private SingletonObject(){} //returns the only available object public static SingletonObject getInstance(){ return instance; } public void printMessage(){ System.out.println('Hello from Singleton object!!!'); } } public class Main { public static void main(String() args) { //illegal statement because constructor is private //Compile Time Error: The constructor SingletonObject() is not visible //SingletonObject object = new SingletonObject(); //call getInstance to retrieve the object available from the class SingletonObject object = SingletonObject.getInstance(); //show the message object.printMessage(); } }
Изход:
Сега, ако проверим основния метод, имайте предвид, че ако се опитаме да създадем обект от сингълтон клас с помощта на нов оператор, компилаторът ще даде грешка при компилацията (вижте коментирания код в основния метод). Получаваме обекта на сингълтон класа с помощта на метода getInstance () и след това можем да го използваме както обикновено за достъп до методи.
Фабричен модел в Java
Фабричният модел се нарича още 'Фабричен метод на модел' или 'Виртуален конструктор' в Java. В този модел ние създаваме интерфейс или абстрактен клас с декларации на методи, а след това конкретните класове или подкласове, изпълняващи този интерфейс или наследяващи класа, са отговорни за създаването на екземпляри на класа.
Предимства
- Фабричният модел е вид творчески модел и е най-често използваният модел в Java.
- Използвайки фабричен модел, ние гарантираме, че действителната логика на създаване не е изложена на външния свят.
Така че, ако клас, изпълняващ фабричен модел, има метод за изчисляване на лихвения процент, тогава конкретните класове ще внедрят този клас и също така ще приложат метода за изчисляване на лихвения процент.
Тогава ще има друг клас, който е фабричен клас, който ще осъществи достъп до тези конкретни екземпляри на клас, така че да не сме наясно как се прилага логиката за изчисляване на лихвения процент. Извикваме само метода и получаваме изхода.
И така, кога точно можем да използваме фабричния метод?
Когато родителските класове решат да делегират създаването на екземпляри на техните подкласове, тогава можем да отидем за фабричен модел (Това е обяснено по-горе). Можем да използваме и фабричния метод, когато класът не знае какви подкласове трябва да бъдат създадени.
Сега нека видим изпълнението на модела на фабричния метод.
Прилагане на фабричния модел
Като пример нека приложим интерфейс с обща форма. От този интерфейс можем да извлечем различни конкретни класове като кръга, правоъгълника и т.н. Тогава ще имаме клас shapeFactory, който ще има достъп до обектите на конкретния клас. UML за този модел е показан по-долу.
Както вече беше обяснено, това е UML диаграмата за фабричен модел. Сега ще внедрим Java програма, демонстрираща фабричния модел.
//Geometric_shape interface interface Geometric_shape { void draw_shape(); } //Geometric shape classes implementing Geometric_shape interface class Rectangle implements Geometric_shape { @Override public void draw_shape() { System.out.println('Rectangle class::draw_shape() method.'); } } class Square implements Geometric_shape { @Override public void draw_shape() { System.out.println('Square class::draw_shape() method.'); } } class Circle implements Geometric_shape { @Override public void draw_shape() { System.out.println('Circle class::draw_shape() method.'); } } //Factory class for Geometric_shape class ShapeFactory { //shapeObject method gets particular shapeType (circle, Square or Rectangle) public Geometric_shape shapeObject(String shapeType){ if(shapeType == null){ return null; } //retrieve Circle object if(shapeType.equalsIgnoreCase('Circle')){ return new Circle(); //retrieve Rectangle object } else if(shapeType.equalsIgnoreCase('Rectangle')){ return new Rectangle(); ////retrieve Square object } else if(shapeType.equalsIgnoreCase('Square')){ return new Square(); } return null; } } public class Main { public static void main(String() args) { //Create a ShapeFactory object to get different geometric shapes ShapeFactory shapeFactory = new ShapeFactory(); //circle Geometric_shape shape_Circle = shapeFactory.shapeObject('CIRCLE'); //draw method of Circle shape_Circle.draw_shape(); //Rectangle Geometric_shape shape_Rectangle = shapeFactory.shapeObject('RECTANGLE'); //draw method of Rectangle shape_Rectangle.draw_shape(); //Square Geometric_shape shape_Square = shapeFactory.shapeObject('SQUARE'); //draw method of square shape_Square.draw_shape(); } }
Изход:
Модел на строител в Java
В модела на Builder използваме подход стъпка по стъпка, за да изградим сложен обект, използвайки малки и прости обекти.
Така че винаги, когато срещнем обект, който не може да бъде създаден в една стъпка, ние използваме модел на конструктор.
Предимства
- Използвайки шаблона Builder, можем да отделим конструкцията и представянето на обект.
- Също така можем да променим вътрешното представяне на обекта.
- Можем да изградим сложни дизайни като цяла система за доставка, използвайки шаблона на конструктора.
Практичен пример за модел на Builder е системата за поръчване на храни, която включва сложни стъпки за събиране на поръчани хранителни продукти, след това опаковане, фактуриране, поръчка за строителство и след това изпращане.
В този урок ще внедрим пример за система за поръчка на таблети, използваща шаблона Builder.
Внедряване на модел на строител
Общата UML диаграма за модела на Builder е дадена по-долу.
Горната диаграма показва UML диаграма на шаблона на Builder. Както е показано на горната диаграма, имаме четири компонента в модела на Builder.
- Продукт: Това представлява сложния обект, който трябва да бъде изграден.
- Абстрактен клас на Builder: Абстрактен клас, съдържащ прототипи на цялата функционалност, необходима за изграждане на сложен обект.
- Клас на ConcreteBuilder: Това е конкретен клас, който наследява от класа Builder и създава определен сложен обект. Можем да имаме толкова класове ConcreteBuilder, колкото са ни необходими.
- Клас на режисьора: Този клас контролира алгоритмите, които генерират крайния продукт.
Следващият пример за програмиране показва демонстрация на модел на Builder с помощта на таблетна система за поръчка на сграда.
import java.util.ArrayList; import java.util.List; //Packing interface for tablets interface Packing { public String pack(); public int price(); } //Tablet class - abstract abstract class Tablet implements Packing{ public abstract String pack(); } //company - extends Tablet abstract class Company extends Tablet{ public abstract int price(); } //Lenovo tablet class Lenovo extends Company{ @Override public int price(){ return 541; } @Override public String pack(){ return 'Lenovo Yoga'; } } //Micromax tablet class MicroMax extends Company { @Override public int price(){ return 338; } @Override public String pack(){ return 'MicroMax'; } } //Tablet type class TabType { private List items=new ArrayList(); //add items public void addItem(Packing packs) { items.add(packs); } //retrieve cost public void getCost(){ for (Packing packs : items) { packs.price(); } } //show all items public void showItems(){ for (Packing packing : items){ System.out.print('Tablet name : '+packing.pack()); System.out.println(', Price(in U.S.Dollars) : '+packing.price()); } } } //builder class for tablets order class TabBuilder { public TabType buildLenovoTab(){ TabType lenovo =new TabType(); lenovo.addItem(new Lenovo()); return lenovo; } public TabType buildMicroMaxTab(){ TabType mmx=new TabType(); mmx.addItem(new MicroMax()); return mmx; } } public class Main{ public static void main(String args()){ //build the tablets order and display the order TabBuilder tabBuilder=new TabBuilder(); TabType tabtype1=tabBuilder.buildLenovoTab(); tabtype1.showItems(); TabType tabtype2=tabBuilder.buildMicroMaxTab(); tabtype2.showItems(); } }
Изход:
В горния пример изградихме пълната система за поръчка на таблети за две марки таблети, т.е. Lenovo и Micromax. Това са класовете concreteBuilder, които наследяват от компанията за абстрактни класове. Тогава имаме клас TabBuilder, който изгражда поръчките и за двата класа на таблета.
често задавани въпроси
В # 1) Какво представляват дизайнерските модели в Java? Какви са видовете дизайнерски модели в Java?
формат на тестовия случай при тестване на софтуер
Отговор: Дизайнерските модели са най-добрите практики, които могат да се използват за разработване на добре тествани решения.
Java има три вида дизайнерски модели:
- Творчески модел на дизайн: Фабричен модел, Абстрактен Фабричен модел, Сингълтън модел, Модел на строител и Образец на прототип са примери за креативни дизайнерски модели. Те са свързани основно със създаването на обекти.
- Структурен дизайн: Те се използват най-вече за създаване на структура на клас. Адаптер, мост и композитен модел са популярни модели на структурен дизайн.
- Модел на поведенчески дизайн: Те осигуряват по-добро взаимодействие между обектите заедно с гъвкавостта за лесно разширяване на изпълнението. Модели на наблюдатели, стратегии и т.н. са някои примери за поведенчески модели.
В # 2) Защо се използват дизайнерски модели?
Отговор: Дизайнерските модели ни предоставят доказан и изпитан модел на решение, който можем да използваме за решаване на сложни проблеми. Моделите на проектиране ни позволяват да изграждаме сплотени модули с хлабав съединител. Моделите на дизайна също правят взаимодействието между дизайнерите по-ефективно и ефективно.
В # 3) Какви са примерите за модели?
Отговор: Примери за естествени модели са видими закономерности, открити в природата. Естествените модели като симетрия, дървета, вълни, пяна, ивици, пукнатини и др. Са някои примери за естествени модели.
Въпрос # 4) MVC дизайн модел ли е?
Отговор: Да, това е един вид модел на проектиране, чрез който можем да изградим приложение, състоящо се от модел на данни, презентация или изглед слой и контролер. Можем да го класифицираме повече като архитектурен модел.
Заключение
Това завършва нашата дискусия за дизайнерските модели в Java. Въпреки че Java поддържа три вида дизайнерски модели, а именно. Творчески, структурни и поведенчески модели, ние се интересуваме повече от модела на креативния дизайн.
Съгласно обхвата на този урок, ние обсъдихме три примера за модели за творчески дизайн, а именно, единичен модел, фабричен модел и модел на строител.
Единичният модел е най-простият дизайнерски модел и фабричният метод се предполага, че е често срещан дизайнерски модел, който се използва широко. Моделът на конструктора се използва за конструиране на сложни обекти и се използва най-вече при разработването на сложни приложения.
=> Вижте Перфектното ръководство за обучение по Java тук.
Препоръчително четене
- Java String с урок за String Buffer и String Builder
- Разполагане на Java: Създаване и изпълнение на Java JAR файл
- Основи на Java: Синтаксис на Java, клас Java и основни концепции на Java
- Java виртуална машина: Как JVM помага при стартирането на Java приложение
- Урок за JAVA за начинаещи: 100+ практически ръководства за Java видео
- Java Integer и Java BigInteger клас с примери
- Java компоненти: Java платформа, JDK, JRE и Java виртуална машина
- Списък с важни ключови думи за Java - запазени думи в Java