Шаблоны проектирования (Design patterns)
Книга Э. Гаммы, Р.Хельма, Р.Джонсона и Дж.Влиссидеса – «банда четырех»
–Вышла в 197* году
–Примеры на C++, кое-что на SmallTalk
С тех пор ничего принципиально нового не придумали
–Примеры для других языков
–Несколько новых паттернов
Определение GoF
Шаблон GoF – описание взаимодействия объектов и классов, адаптированных для решения общей задачи проектирования в конкретном контексте.
Не является паттерном
–класс
–структуры данных
–потоки
–архитектура в целом (Client-Server)
Достоинства:
–предложены хорошими специалистами
–проверены временем
–составляют удобный словарь для общения
Включают в себя:
–название (возможно, несколько)
–описание задачи
–схема решения
–обсуждение результатов
Классификация порождающие паттерны
–организуют создание объектов структурные паттерны
–организуют структуру классов паттерны поведения
–организуют поведение объектов
Шаблон Factory
задача:
– возвращать объекты класса-наследника, не изменяя клиентов (runners)
решение:
–описать класс, который имеет методы для создания одного объекта из нескольких возможных (являющихся подклассом одного суперкласса) на основе передаваемых данных.
/* суперкласс для классов создаваемых Factory */
public abstract class Base {
public abstract void perform();
}
/* подклассы */
public class First extends Base {
public void perform() {
System.out.println("First");
}
}
public class Second extends Base {
public void perform() {
System.out.println("Second");
}
}
/* класс-фабрика */
public class ClassFactory {
private enum Signs {FIRST, SECOND}
public static Base getClassFromFactory(String id) {
Signs sign = Signs.valueOf(id.toUpperCase());
switch(sign){
case FIRST : return new First();
case SECOND : return new Second();
default : throw new EnumConstantNotPresentException(
Signs.class, sign.name());
}
}
}
public class Runner {
public static void main(String args[]) {
Base ob1 = ClassFactory.getClassFromFactory("first");
Base ob2 = ClassFactory.getClassFromFactory("second");
ob1.perform();
ob2.perform();
}
}
Шаблон Builder
задача:
– создать и возвращать один объект различными способами.
решение:
–описать абстрактный класс, который имеет методы для задания полей объекта–клиента и возврата созданного объекта.
/* «сложный» для построения объект */
public class User {
private String login = "Guest";
private String password = "yes";
public String getLogin() {
return login;
}
public void setLogin(String login) {
this.login = login;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
/* абстрактный класс и разные способы построения объекта */
public abstract class BaseBuilder {
protected User user = new User();
public User getUser() {
return user;
}
public abstract void buildLogin();
public abstract void buildPassword();
}
public class AdminBuilder extends BaseBuilder {
public void buildLogin() {
//реализация
user.setLogin("Admin");
}
public void buildPassword() {
//реализация
user.setPassword("MAXmin");
}
}
public class ModeratorBuilder extends BaseBuilder {
public void buildLogin() {
//реализация
user.setLogin("Moderator");
}
public void buildPassword() {
//реализация
user.setPassword("MoDmin");
}
}
public class Runner {
private static User buildUser(BaseBuilder builder) {
builder.buildLogin();
builder.buildPassword();
return builder.getUser();
}
public static void main(String args[]) {
User u1 = buildUser(new AdminBuilder());
User u2 = buildUser(new ModeratorBuilder());
System.out.println(u1.getLogin());
System.out.println(u1.getPassword());
System.out.println(u2.getLogin());
System.out.println(u2.getPassword());
}
}
Шаблон Singleton
задача:
– создать единственный объект и возвращать только его.
решение:
– описать класс со статическим приватным полем, которое возвращать статическим методом.
public class Singleton {
private static Singleton instance = null;
private Singleton() { }
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
public class Runner {
public static void main(String args[]) {
Singleton s1= Singleton.getInstance();
// так создать нельзя
// Singleton s1= new Singleton();
Singleton s2= Singleton.getInstance();
//s2==s1 - true
}
}
Шаблон Model – View – Controller
//альтернатива 1
public class Hello {
public static void main (String[] args) {
System.out.println("Hello, World!");
}
}
//альтернатива 2
class Runner {
public static void main (String[] args) {
new Logic().start();
}
}
public class Logic {
public Logic(){
}
public void start() {
System.out.println("Hello, World!");
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.