Шаблоны проектирования (Design patterns). Определение GoF. Классификация порождающие паттерны

Страницы работы

Содержание работы

Шаблоны проектирования (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!");

Похожие материалы

Информация о работе