- Дизайн үлгілері дегеніміз не?
- Қандай дизайн үлгілерін білесіз?
- Singleton үлгісі туралы айтып беріңізші? Оны қалай қауіпсіз етуге болады?
- Зауыт үлгісі туралы айтып беріңізші?
- AbstractFactory үлгісі туралы айтып беріңіз
- Adaper үлгісі, оның орауыштан айырмашылығы туралы айтып беріңізші?
- Прокси үлгісі туралы айтып беріңіз
- Итератор дегеніміз не? Итераторға қатысты қандай интерфейстерді білесіз?
- Бізге Arrays класы не үшін қажет?
- Бізге «Жинақтар» сыныбы не үшін қажет?
-
Дизайн үлгілері - бұл бағдарламаларды немесе олардың бөліктерін жобалау және әзірлеу кезінде пайда болатын ең көп таралған мәселелердің жақсы бекітілген, сәтті шешімдері.
-
Singleton
,Factory
,Abstract Factory
,Template method
,Strategy
,Pool
,Adapter
,Proxy
,Bridge
,MVC
. -
Бағдарламада болуы үшін сыныптың бір ғана данасы қажет болғанда, үлгі пайдаланылады
Singleton
. Бұл келесідей көрінеді (жалқау инициализация):clas Singleton { private Singleton instance; private Singleton() {} public static Singletot getInstance() { if (instance == null) instance = new Singleton(); return instance; } }
getInstance()
Оны қауіпсіз ету үшін әдіске модификатор қосуға боладыsynchronized
. Бірақ бұл ең жақсы шешім емес (бірақ ең қарапайым).getInstance
Әлдеқайда жақсы шешім - әдісті осылай жазу (екі рет тексерілген құлыптау):public static synchronized Singleton getInstance() { if (instance == null) synchronized(Singleton.class) { instance = new Singleton(); } return instance; }
-
Үлгі
Factory
– генеративті үлгі. Ол сұраныс бойынша an objectілерді құруға мүмкіндік береді (мысалы, белгілі бір жағдайларда). Бұл келесідей көрінеді:class Factory{ public static Object1 getObject1() { return new Object1(); } public static Object2 getObject2() { return new Object2(); } public static Object3 getObject3() { return new Object3(); } }
Бұл үлгінің деп аталатын нұсқасы да бар
FactoryMethod
. Осы үлгі бойынша кіріс деректеріне (параметр мәндеріне) байланысты бір әдісте әртүрлі an objectілер құрылады. Барлық осы нысандардың ортақ ата-тегі (немесе ортақ іске асырылатын интерфейс) болуы керек. Бұл келесідей көрінеді:class FactoryMethod { public enum TypeObject { TYPE1, TYPE2, TYPE3 } public static CommonClass getObject(TypeObject type) { switch(type) { case TYPE1: return new Object1(); case TYPE2: return new Object2(); case TYPE3: return new Object3(); default: return null; } } }
Сыныптар
Object1
жәнеObject2
сыныптанObject3
мұраCommonClass
. -
Үлгі
Abstract Factory
де генеративті дизайн үлгісі болып табылады. Осы үлгі бойынша бірнеше бетон зауыттары үшін шаблон қызметін атқаратын абстрактілі фабрика құрылады. Міне, мысал:class Human {} class Boy extends Human {} class TeenBoy extends Human {} class Man extends Human {} class OldMan extends Human {} class Girl extends Human {} class TeenGirl extends Human {} class Woman extends Human {} class OldWoman extends Human {} interface AbstractFactory { Human getPerson(int age); } class FactoryMale implements AbstractFactory { public Human getPerson(int age) { if (age < 12) return new Boy(); if (age >= 12 && age <= 20) return new TeenBoy(); if (age > 20 && age < 60) return new Man(); return new OldMan(); } } сlass FactoryFemale implements AbstractFactory { public Human getPerson(int age) { if (age < 12) return new Girl(); if (age >= 12 && age <= 20) return new TeenGirl(); if (age > 20 && age < 60) return new Woman(); return new OldWoman(); } }
-
Үлгі
Adapter
– құрылымдық үлгі. Оның орындалуы бір түрдегі нысанды басқа түрдегі an object қажет болған жағдайда (әдетте дерексіз түрлер) пайдалануға мүмкіндік береді. Бұл үлгіні іске асыру мысалы:interface TotalTime { int getTotalSeconds(); } interface Time { int getHours(); int getMinutes(); int getSeconds(); } class TimeAdapter extends TotalTime { private Time time; public TimeAdapter(Time time) { this.time = time; } public int getTotalTime() { return time.getSeconds + time.getMinutes * 60 + time.getHours * 60 * 60; } } class TotalTimeAdapter extends Time { private TotalTime totalTime; public TotalTimeAdapter(TotalTime totalTime) { this.totalTime = totalTime; } public int getSeconds() { return totalTime % 60; } public int getMinutes() { return (totalTime / 60) % 60; } public int getHours() { return totaltime/ (60 * 60) ; } } class Main { public static void main(String[] args) { Time time = new Time() { public int getSeconds() { return LocalTime.now().getSecond(); } public int getMinutes() { return LocalTime.now().getMinute(); } public int getHours() { return LocalTime.now().getHour() ; } }; TotalTime totalTime = new TimeAdapter(time); System.out.println(totalTime.getTotalSeconds()); TotalTime totalTime2 = new TotalTime() { public int getTotalSeconds() { LocalTime currTime = LocalTime.now(); return currTime.getSecond() + currTime.getMinute * 60 + currTime.getHour * 60 * 60; } }; Time time2 = new TotalTimeAdapter(totalTime2); System.out.println(time2.getHours + ":" + time2.getMinutes() + ":" + time2.getSeconds()); } }
При реализации паттерна
Wrapper
создаётся класс, который оборачивает исходный класс и реализует тот же интерфейс, который реализует исходный класс. Таким образом, это позволяет расширить функциональность исходного класса и использовать новый класс там, где ожидается использование исходного класса. Это отличается от реализации паттернаAdapter
тем, что в данном случае используется один интерфейс (тот же, что есть у исходного класса). В паттернеAdapter
же используется два интерфейса, и класс, который оборачивает экземпяр исходного класса, реализует совсем другой инферфейс, не интерфейс исходного класса. -
Паттерн
Proxy
— это структурный паттерн проектирования. Он нужен для того, чтобы контролировать доступ к Howому-то an objectу. Для этого пишется класс по типу "обёртка", то есть внутрь класса передаётся исходный an object, реализующий некий интерфейс, сам класс тоже реализует этот интерфейс, и в каждом методе этого класса вызывается похожий метод у исходного an object. Реализация того же интерфейса, что и у исходного an object, позволяет подменить исходный an object прокси-an objectом. Также это позволяет, не меняя исходного an object, "навешивать" на его методы Howую-то специальную дополнительную функциональность (например, логирование, проверка прав доступа, кэширование и т.д.). Пример:interface Bank { void setUserMoney(User user, double money); double getUserMoney(User user); } class CitiBank implements Bank { //оригинальный класс public void setUserMoney(User user, double money) { UserDAO.update(user,money); } public double getUserMoney(User user) { UserDAO.getUserMoney(user); } } class SecurityProxyBank implements Bank { private Bank bank; public SecurityProxyBank(Bank bank) { this.bank = bank; } public void setUserMoney(User user, double money) { if (!SecurityManager.authorize(user,BankAccounts.Manager) throw new SecurityException("User can't change money value"); UserDAO.update(user,money); } public double getUserMoney(User user) { if (!SecurityManager.authorize(user,BankAccounts.Manager) throw new SecurityException("User can't get money value"); UserDAO.getUserMoney(user); }
-
Итератор — это специальный внутренний an object коллекции, который позволяет последовательно перебирать элементы этой коллекций. Этот an object должен реализовывать интерфейс
Iterator<E>
, либоListIterator<E>
(для списков). Также, для того, чтобы перебирать элементы коллекции, коллекция должна поддерживать интерфейсIterable<E>
. ИнтерфейсIterable<E>
содержит всего один метод —iterator()
, который позволяет извне получить доступ к итератору коллекции.Интерфейс
Iterator<E>
содержит следующие методы:-
boolean hasNext()
— проверяет, есть ли в коллекции ещё Howой-то элемент -
E next()
— позволяет получить очередной элемент коллекции (после получения element, внутренний курсор итератора передвигается на следующий элемент коллекции) -
void remove()
— удаляет текущий элемент из коллекции
Интерфейс же
ListIterator<E>
содержит такие методы:-
boolean hasNext()
— проверяет, существуют ли ещё один элемент в коллекции (следующий за текущим) -
E next()
— возвращает очередной элемент коллекции (и передвигает внутренний курсок итератора на следующий элемент) -
int nextIndex()
— возвращает индекс следующего element -
void set(E e)
— устанавливает meaning текущего elementvoid add(E e)
. Добавляет элемент в конец списка. -
boolean hasPrevious()
— проверяет, существует ли Howой-то элемент в коллекции перед данным элементом -
E previous()
— возвращает текущий элемент коллекции и переводит курсор на предыдущий элемент коллекции -
int previousIndex
— возвращает индекс предыдущего element коллекции -
void remove()
— удаляет текущий элемент коллекции -
void add(E e)
— добавляет элемент e после текущего element коллекции
-
-
Класс
Arrays
- массивтердің әртүрлі манипуляцияларына арналған утorталар класы. Бұл класта массивті тізімге айналдыру, массив бойынша іздеу, массивті көшіру, массивтерді салыстыру, массив хэшcodeын алу, массивті жол ретінде көрсету және т.б. әдістері бар. -
Класс
Collections
– жинақтармен жұмыс істеуге арналған пайдалы сынып. Бұл сыныпта жинаққа элементтер қосу, коллекцияны элементтермен толтыру, жинақты іздеу, жинақты көшіру, жинақты салыстыру, коллекцияның максималды және минималды элементтерін табу, сондай-ақ коллекциялардың нақты модификацияларын алу әдістері бар. белгілі түрлер (мысалы, ағынмен қауіпсіз топтаманы немесе бір элементі бар өзгермейтін топтаманы алуға болады).
GO TO FULL VERSION