Java/Паттерны

Материал из Викиучебника — открытых книг для открытого мира
Перейти к: навигация, поиск
Книга Java


редактировать содержание


История[править]

Идейным отцом применения шаблонов проектирования при разработке ПО считается профессор архитектуры Университета Калифорнии в Беркли Christofer Alexander.Однако по-настоящему ощутимый вклад в дело популяризации технологии шаблонов проектирования внесла изданная в 1995 году книга Design Patterns: Elements of Reusable Object-Oriented Software. Её авторы Erich Gamma, Richard Helm, Ralph Johnson и John Vlissides приложили так много усилий для распространения своих идей, что заслужили шутливое прозвище “Банда четырёх” (GoF — gang of four). В книге представлено введение в довольно сложный язык шаблонов с иллюстрациями реализации обсуждаемых шаблонов на языке C++.

Итераторы[править]

Iterator - это указатель, который в каждый момент времени указывает на один из членов списка и умеет передвигаться к следующему члену. Все классы-наследники Collection поддерживают итераторы.

Пример использования:

1 List arr = new ArrayList();
2 // ...
3 // Adding some elements into arr
4 // ...
5 Iterator iter = arr.iterator();
6 while(iter.hasNext()) {
7   Object obj = iter.next();
8   // ...
9 }

В строке 7 происходят несколько вещей:

  1. функция next - возвращает очередной элемент
  2. Ссылка на этот элемент передается в obj
  3. iter продвигается и указывает на следующий элемент

Singleton[править]

Singleton - порождающий шаблон проектирования, гарантирующий, что в однопоточном приложении будет единственный экземпляр класса с глобальной точкой доступа.

Пример[править]

 1 class Singleton {
 2   private static Singleton instance;
 3 
 4   private Singleton() {
 5   }
 6 
 7   public static synchronized  Singleton getInstance() {
 8     if( instance==null ){
 9       instance = new Singleton();
10     }
11     return instance;
12   }
13 }

Как это работает[править]

Существует только один экземпляр класса. Т.к. конструктор приватный - то чтобы получить экземпляр класса нужно обязательно вызвать статический метод getInstance, который заботится о том, что во всей системе есть только один экземпляр класса.

Когда используют Singleton?[править]

  • В том случае если мы хотим производить какое-либо действие при любом обращении к классу - это действие можно включить в функцию getInstance между строками 10 и 11. Например добавлять к статическому счетчику единицу - тогда мы будем в любой момент точно знать сколько раз запрашивался объект Singleton.
  • В случае кеширования данных.

Factory[править]

 1 class Person {...}
 2 class Worker extends Person {...}
 3 class Manager extends Person {...}
 4 
 5 class PersonFactory {
 6   private boolean isWorker(int id) {...}
 7 
 8   private boolean isManager(int id) {...}
 9 
10   public Person getPerson(int id) {
11     if(isWorker(id)) {
12       return new Worker(id);
13     }
14     if(isManager(id)) {
15       return new Manager(id);
16     }
17     return new Person(id);
18   }
19 }

Builder[править]

Используется для создания экземпляра класса с конкретными свойствами из-за того, что свойств может быть много и свойства объекта могут иметь сложную логику лучше вынести все это в отдельный класс

 1 /**
 2 ** @author javawiki@ya.ru Чтв 10 Июн 2010 23:36:49 
 3 **
 4 **/
 5 import java.util.*;
 6 
 7 public class App {
 8 	public static void main(String[] args) {
 9 		PersonCreator pc = new PersonCreator();
10 		Person p1 = pc.createPerson("Вася", 10);
11 		Person p2 = pc.createPerson("Петя", 12);
12 		System.out.printf("%s= %s %s \n", p1, p1.name, p1.age);
13 		System.out.printf("%s= %s %s \n", p2, p2.name, p2.age);
14 	}
15 }
16 
17 public class Person {
18 	public String name = "";
19 	public int age = 0;
20 }
21 // промежуточный класс для использования билдера (нужен, например, для создания нескольких перегруженных методов (например, новорожденным не нужно указывать возраст))
22 
23 public class PersonCreator {
24 	Builder builder = new Builder();
25 
26 	public Person createPerson(String name, int age) {
27 		builder.create();
28 		builder.setName(name);
29 		builder.setAge(age);
30 		return builder.getPerson();
31 	}
32 }
33 
34 public class Builder {
35 
36 	private Person person;
37 
38 	public void create() {
39 		person = new Person();
40 	}
41 
42 	public void setName(String name) {
43 		this.person.name = name;
44 	}
45 
46 	public void setAge(int age) {
47 		this.person.age = age;
48 		// если, например, возраст меньше 0, то нужно выбросить исключение!
49 	}
50 
51 	public Person getPerson() {
52 		return this.person;
53 	}
54 }