From 48ff36fc7f509388d7645ff25deb88cfff25fd94 Mon Sep 17 00:00:00 2001 From: Denis Stepulenok Date: Thu, 25 Jun 2015 22:50:57 +0300 Subject: [PATCH 1/9] Initial commit --- .gitignore | 12 ++++++++++++ README.md | 2 ++ 2 files changed, 14 insertions(+) create mode 100644 .gitignore create mode 100644 README.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..32858aa --- /dev/null +++ b/.gitignore @@ -0,0 +1,12 @@ +*.class + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.ear + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* diff --git a/README.md b/README.md new file mode 100644 index 0000000..ca920e4 --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# JavaPatterns +Шаблоны проектирования на Java From 3b83c602344ec0f1a2fb449c2ea9c156f322ef64 Mon Sep 17 00:00:00 2001 From: Denis Stepulenok Date: Fri, 26 Jun 2015 00:57:24 +0300 Subject: [PATCH 2/9] Singletone --- .gitignore | 7 +++ README.md | 12 +++++ pom.xml | 47 +++++++++++++++++++ .../creational/singletone/Singletone.java | 29 ++++++++++++ .../creational/singletone/SingletoneTest.java | 24 ++++++++++ 5 files changed, 119 insertions(+) create mode 100644 pom.xml create mode 100644 src/main/java/creational/singletone/Singletone.java create mode 100644 src/main/java/creational/singletone/SingletoneTest.java diff --git a/.gitignore b/.gitignore index 32858aa..f9ea204 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,10 @@ # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml hs_err_pid* + +# Idea project files +.idea +JavaPatterns.iml + +# Maven results +target \ No newline at end of file diff --git a/README.md b/README.md index ca920e4..c0de4d6 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,14 @@ # JavaPatterns Шаблоны проектирования на Java + +**Шаблон проектирования** или **паттерн** (design pattern) - +повторяемая архитектурная конструкция, +представляющая собой решение проблемы  +проектирования в рамках некоторого часто возникающего контекста. + +Классификация шаблонов +---------------------- +* Поведенческие +* Порождающие +* Структурные + diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..95edbf9 --- /dev/null +++ b/pom.xml @@ -0,0 +1,47 @@ + + + 4.0.0 + + levelp + JavaPatterns + 1.0-SNAPSHOT + + Шаблоны проектирования в Java + + + UTF-8 + UTF-8 + + + + + junit + junit + RELEASE + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + + + org.apache.maven.plugins + maven-resources-plugin + + UTF-8 + + + + + + \ No newline at end of file diff --git a/src/main/java/creational/singletone/Singletone.java b/src/main/java/creational/singletone/Singletone.java new file mode 100644 index 0000000..e06d8f0 --- /dev/null +++ b/src/main/java/creational/singletone/Singletone.java @@ -0,0 +1,29 @@ +package creational.singletone; + +/** + * Одиночка + */ +public class Singletone { + // Считаем количество созданных объектов + static int count = 0; + static Singletone uniqueInstance; + // Идентификатор + int id = ++count; + + // Только изнутри класса можно делать новые объекты + private Singletone() { + } + + public static Singletone instance() { + // Если нет ещё ни одного экземпляра объекта => создаём + if (uniqueInstance == null) { + uniqueInstance = new Singletone(); + } + return uniqueInstance; + } + + @Override + public String toString() { + return "Object #" + id; + } +} diff --git a/src/main/java/creational/singletone/SingletoneTest.java b/src/main/java/creational/singletone/SingletoneTest.java new file mode 100644 index 0000000..3dbdf63 --- /dev/null +++ b/src/main/java/creational/singletone/SingletoneTest.java @@ -0,0 +1,24 @@ +package creational.singletone; + +import org.junit.Test; + +import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertNull; + +/** + * Демонстрация работы Singletone + */ +public class SingletoneTest { + + @Test + public void testSimple() { + assertNull("Объект ещё не создан", Singletone.uniqueInstance); + assertEquals(0, Singletone.count); + Singletone s1 = Singletone.instance(); + assertEquals(1, s1.id); + Singletone s2 = Singletone.instance(); + assertEquals(1, s2.id); + assertEquals(1, Singletone.instance().id); + assertEquals(1, Singletone.instance().id); + } +} From b630ec00cc8e58d3156aff8349a40650c33e7925 Mon Sep 17 00:00:00 2001 From: Ivan Konovalov Date: Thu, 2 Jul 2015 15:11:25 +0300 Subject: [PATCH 3/9] Proxy pattern and test added --- .../java/creational/proxy/Displayable.java | 10 ++++ src/main/java/creational/proxy/Image.java | 41 +++++++++++++++ .../java/creational/proxy/ProxyImage.java | 50 +++++++++++++++++++ src/main/java/creational/proxy/ProxyTest.java | 24 +++++++++ 4 files changed, 125 insertions(+) create mode 100644 src/main/java/creational/proxy/Displayable.java create mode 100644 src/main/java/creational/proxy/Image.java create mode 100644 src/main/java/creational/proxy/ProxyImage.java create mode 100644 src/main/java/creational/proxy/ProxyTest.java diff --git a/src/main/java/creational/proxy/Displayable.java b/src/main/java/creational/proxy/Displayable.java new file mode 100644 index 0000000..734f449 --- /dev/null +++ b/src/main/java/creational/proxy/Displayable.java @@ -0,0 +1,10 @@ +package creational.proxy; + +/** + * Created by nvans on 02.07.2015. + * + * @author Ivan Konovalov + */ +public interface Displayable { + void display(); +} diff --git a/src/main/java/creational/proxy/Image.java b/src/main/java/creational/proxy/Image.java new file mode 100644 index 0000000..2e32957 --- /dev/null +++ b/src/main/java/creational/proxy/Image.java @@ -0,0 +1,41 @@ +package creational.proxy; + +/** + * Created by nvans on 02.07.2015. + * + * @author Ivan Konovalov + */ +public class Image implements Displayable { + + /** + * File name field + */ + private String fileName; + + /** + * Constructor + * @param fileName + */ + public Image(String fileName) { + this.fileName = fileName; + loadFile(fileName); + } + + + /** + * File loading + * @param fileName + */ + private void loadFile(String fileName) { + System.out.println("Loading " + fileName); + } + + + /** + * Displayable interface implementation + */ + @Override + public void display() { + System.out.println("Displaying " + fileName); + } +} diff --git a/src/main/java/creational/proxy/ProxyImage.java b/src/main/java/creational/proxy/ProxyImage.java new file mode 100644 index 0000000..fd8455d --- /dev/null +++ b/src/main/java/creational/proxy/ProxyImage.java @@ -0,0 +1,50 @@ +package creational.proxy; + +/** + * + * Virtual proxies pattern + * + * @author Ivan Konovalov + */ +public class ProxyImage implements Displayable { + + /** + * Link to the real object + */ + private Image image; + + /** + * File name + */ + private String fileName; + + /** + * Constructor + * @param fileName + */ + public ProxyImage(String fileName) { + this.fileName = fileName; + } + + /** + * Getter for real object + * @return + */ + public Image getImage() { + return image; + } + + /** + * Displayable interface implementation + */ + @Override + public void display() { + // The real object lazy initialization + if (image == null) { + image = new Image(fileName); + } + // Call the real object method + // after initialization + image.display(); + } +} diff --git a/src/main/java/creational/proxy/ProxyTest.java b/src/main/java/creational/proxy/ProxyTest.java new file mode 100644 index 0000000..459fb71 --- /dev/null +++ b/src/main/java/creational/proxy/ProxyTest.java @@ -0,0 +1,24 @@ +package creational.proxy; + +import org.junit.Test; + +import static junit.framework.Assert.assertNull; +import static junit.framework.Assert.assertTrue; + +/** + * Created by nvans on 02.07.2015. + * + * @author Ivan Konovalov + */ +public class ProxyTest { + @Test + public void TestProxy() { + ProxyImage proxyImage = new ProxyImage("11.file"); + + assertNull("The real object is not initialized", proxyImage.getImage()); + + proxyImage.display(); + + assertTrue(proxyImage.getImage() instanceof Image); + } +} From b18d89fb323e628778402d82052aff83ef64b68d Mon Sep 17 00:00:00 2001 From: Ivan Konovalov Date: Thu, 2 Jul 2015 15:15:29 +0300 Subject: [PATCH 4/9] Proxy pattern added --- src/main/java/{creational => structural}/proxy/Displayable.java | 2 +- src/main/java/{creational => structural}/proxy/Image.java | 2 +- src/main/java/{creational => structural}/proxy/ProxyImage.java | 2 +- src/main/java/{creational => structural}/proxy/ProxyTest.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) rename src/main/java/{creational => structural}/proxy/Displayable.java (77%) rename src/main/java/{creational => structural}/proxy/Image.java (91%) rename src/main/java/{creational => structural}/proxy/ProxyImage.java (91%) rename src/main/java/{creational => structural}/proxy/ProxyTest.java (90%) diff --git a/src/main/java/creational/proxy/Displayable.java b/src/main/java/structural/proxy/Displayable.java similarity index 77% rename from src/main/java/creational/proxy/Displayable.java rename to src/main/java/structural/proxy/Displayable.java index 734f449..8d6aff7 100644 --- a/src/main/java/creational/proxy/Displayable.java +++ b/src/main/java/structural/proxy/Displayable.java @@ -1,4 +1,4 @@ -package creational.proxy; +package structural.proxy; /** * Created by nvans on 02.07.2015. diff --git a/src/main/java/creational/proxy/Image.java b/src/main/java/structural/proxy/Image.java similarity index 91% rename from src/main/java/creational/proxy/Image.java rename to src/main/java/structural/proxy/Image.java index 2e32957..07ce463 100644 --- a/src/main/java/creational/proxy/Image.java +++ b/src/main/java/structural/proxy/Image.java @@ -1,4 +1,4 @@ -package creational.proxy; +package structural.proxy; /** * Created by nvans on 02.07.2015. diff --git a/src/main/java/creational/proxy/ProxyImage.java b/src/main/java/structural/proxy/ProxyImage.java similarity index 91% rename from src/main/java/creational/proxy/ProxyImage.java rename to src/main/java/structural/proxy/ProxyImage.java index fd8455d..1b84b4b 100644 --- a/src/main/java/creational/proxy/ProxyImage.java +++ b/src/main/java/structural/proxy/ProxyImage.java @@ -1,4 +1,4 @@ -package creational.proxy; +package structural.proxy; /** * diff --git a/src/main/java/creational/proxy/ProxyTest.java b/src/main/java/structural/proxy/ProxyTest.java similarity index 90% rename from src/main/java/creational/proxy/ProxyTest.java rename to src/main/java/structural/proxy/ProxyTest.java index 459fb71..a07bc50 100644 --- a/src/main/java/creational/proxy/ProxyTest.java +++ b/src/main/java/structural/proxy/ProxyTest.java @@ -1,4 +1,4 @@ -package creational.proxy; +package structural.proxy; import org.junit.Test; From b2d7ba58c14c1cec430bf5d33238e1be1187bd1c Mon Sep 17 00:00:00 2001 From: Denis Stepulenok Date: Thu, 2 Jul 2015 21:47:05 +0300 Subject: [PATCH 5/9] =?UTF-8?q?=D0=A8=D0=B0=D0=B1=D0=BB=D0=BE=D0=BD=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .travis.yml | 3 ++ README.md | 43 +++++++++++++++--- src/main/java/behavioral/command/Command.java | 17 +++++++ .../java/behavioral/command/Receiver.java | 17 +++++++ src/main/java/behavioral/command/State.java | 44 +++++++++++++++++++ .../command/operations/AddCommand.java | 24 ++++++++++ .../command/operations/DivCommand.java | 24 ++++++++++ .../command/operations/MulCommand.java | 24 ++++++++++ .../command/operations/SubCommand.java | 24 ++++++++++ .../builder/CheapComputerBuilder.java | 18 ++++++++ .../java/creational/builder/Computer.java | 34 ++++++++++++++ .../creational/builder/ComputerBuilder.java | 22 ++++++++++ .../builder/ComputerBuilderTest.java | 23 ++++++++++ .../java/creational/builder/Director.java | 23 ++++++++++ .../creational/singletone/Singletone.java | 8 +++- src/main/java/factory/Ticket.java | 33 ++++++++++++++ src/main/java/factory/TicketsFactory.java | 27 ++++++++++++ .../java/behavioral/command/CommandTest.java | 39 ++++++++++++++++ src/test/java/factory/FactoryTest.java | 33 ++++++++++++++ 19 files changed, 473 insertions(+), 7 deletions(-) create mode 100644 .travis.yml create mode 100644 src/main/java/behavioral/command/Command.java create mode 100644 src/main/java/behavioral/command/Receiver.java create mode 100644 src/main/java/behavioral/command/State.java create mode 100644 src/main/java/behavioral/command/operations/AddCommand.java create mode 100644 src/main/java/behavioral/command/operations/DivCommand.java create mode 100644 src/main/java/behavioral/command/operations/MulCommand.java create mode 100644 src/main/java/behavioral/command/operations/SubCommand.java create mode 100644 src/main/java/creational/builder/CheapComputerBuilder.java create mode 100644 src/main/java/creational/builder/Computer.java create mode 100644 src/main/java/creational/builder/ComputerBuilder.java create mode 100644 src/main/java/creational/builder/ComputerBuilderTest.java create mode 100644 src/main/java/creational/builder/Director.java create mode 100644 src/main/java/factory/Ticket.java create mode 100644 src/main/java/factory/TicketsFactory.java create mode 100644 src/test/java/behavioral/command/CommandTest.java create mode 100644 src/test/java/factory/FactoryTest.java diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..c4f11b7 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,3 @@ +language: java +jdk: + - oraclejdk8 \ No newline at end of file diff --git a/README.md b/README.md index c0de4d6..6301ac6 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,8 @@ -# JavaPatterns +[![Build Status](https://travis-ci.org/levelp/JavaPatterns.svg?branch=master)](https://travis-ci.org/levelp/JavaPatterns) +[![Coverage Status](https://coveralls.io/repos/github/levelp/JavaPatterns/badge.svg?branch=master)](https://coveralls.io/github/levelp/JavaPatterns?branch=master) + Шаблоны проектирования на Java +============================== **Шаблон проектирования** или **паттерн** (design pattern) - повторяемая архитектурная конструкция, @@ -8,7 +11,37 @@ Классификация шаблонов ---------------------- -* Поведенческие -* Порождающие -* Структурные - +* Поведенческие (behavioral) + * Цепочка ответственности (Chain of responsibilily) + * Команда (Command) + * Интерпретатор (Interpreter) + * Итератор (Iterator) + * Посредник (Mediator) + * Хранитель (Memento) + * Null Object + * Наблюдатель (Observer) + * Слуга (Servant) + * Specification (Specification) + * Состояние (State) + * Стратегия (Strategy) + * Шаблонный метод (Template method) + * Посетитель (Visitor) +* Порождающие (creational) - абстрагируют процесс инстанцирования (создания) объекта + * Одиночка (singleton) - класс, который может иметь только один экземпляр + * Абстрактная фабрика (Abstract factory) - класс, который представляет собой интерфейс для создания компонентов системы + * Строитель (Builder) + * Фабричный метод (Factory method) - определяет интерфейс для создания объекта, но оставляет подклассам решение о том, какой класс создавать + * Отложенная инициализация (Lazy initialization) + * Пул одиночек (Multiton) + * Объектный пул (Object pool) + * Прототип (Prototype) - определяет интерфейс создания объекта через клонирование другого объекта вместо создания через конструктор + * Получение ресурса есть инициализация Resource acquisition is initialization (RAII) - получение некоторого ресурса совмещается с инициализацией, а освобождение — с уничтожением объекта. +* Структурные (structural) + * Адаптер (Adapter) - обеспечивает взаимодействие двух других объектов, один из которых использует, а другой предоставляет несовместимый с первым интерфейс + * Мост (Bridge) - структура, позволяющая изменять интерфейс обращения и интерфейс реализации класса независимо + * Компоновщик (Composite) + * Декоратор или Wrapper/Обёртка - класс, расширяющий функциональность другого класса без использования наследования + * Фасад (Facade) - объект, который абстрагирует работу с несколькими классами, объединяя их в единое целое + * Единая точка входа (Front controller) + * Приспособленец (Flyweight) - объект, представляющий себя как уникальный экземпляр в разных местах программы, но по факту не являющийся таковым + * Заместитель (Proxy) - посредник между двумя другими объектами, который реализует/ограничивает доступ к объекту, к которому обращаются через него diff --git a/src/main/java/behavioral/command/Command.java b/src/main/java/behavioral/command/Command.java new file mode 100644 index 0000000..ef036b9 --- /dev/null +++ b/src/main/java/behavioral/command/Command.java @@ -0,0 +1,17 @@ +package behavioral.command; + +/** + * Команда + */ +public abstract class Command { + protected final State state; + + public Command(State state) { + this.state = state; + } + + /** + * Выполнить команду + */ + public abstract void execute(); +} diff --git a/src/main/java/behavioral/command/Receiver.java b/src/main/java/behavioral/command/Receiver.java new file mode 100644 index 0000000..c5b4c31 --- /dev/null +++ b/src/main/java/behavioral/command/Receiver.java @@ -0,0 +1,17 @@ +package behavioral.command; + +/** + * Обработка цепо + */ +public class Receiver { + private final State state; + + public Receiver(State state) { + this.state = state; + } + + public void action(Command command) { + System.out.println(command.getClass().getSimpleName()); + command.execute(); + } +} diff --git a/src/main/java/behavioral/command/State.java b/src/main/java/behavioral/command/State.java new file mode 100644 index 0000000..5bfbf30 --- /dev/null +++ b/src/main/java/behavioral/command/State.java @@ -0,0 +1,44 @@ +package behavioral.command; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * Текущее состояние калькулятора + */ +public class State { + /** + * Текущее значение + */ + public int curIndex = 0; + + /** + * Значение + */ + public List values = new ArrayList<>( + Arrays.asList(0.0)); + + /** + * @return Текущее значение + */ + public double curValue() { + return values.get(curIndex); + } + + public void addValue(double newValue) { + values = values.subList(0, curIndex + 1); + values.add(newValue); + curIndex = values.size() - 1; + } + + public void undo() { + if (curIndex > 0) + curIndex--; + } + + public void redo() { + if (curIndex < values.size() - 1) + curIndex++; + } +} diff --git a/src/main/java/behavioral/command/operations/AddCommand.java b/src/main/java/behavioral/command/operations/AddCommand.java new file mode 100644 index 0000000..7846bc3 --- /dev/null +++ b/src/main/java/behavioral/command/operations/AddCommand.java @@ -0,0 +1,24 @@ +package behavioral.command.operations; + +import behavioral.command.Command; +import behavioral.command.State; + +/** + * Прибавить число + */ +public class AddCommand extends Command { + /** + * Какое значение прибавить + */ + public double value; + + public AddCommand(State state, double value) { + super(state); + this.value = value; + } + + @Override + public void execute() { + state.addValue(state.curValue() + value); + } +} diff --git a/src/main/java/behavioral/command/operations/DivCommand.java b/src/main/java/behavioral/command/operations/DivCommand.java new file mode 100644 index 0000000..e02e932 --- /dev/null +++ b/src/main/java/behavioral/command/operations/DivCommand.java @@ -0,0 +1,24 @@ +package behavioral.command.operations; + +import behavioral.command.Command; +import behavioral.command.State; + +/** + * Разделить число + */ +public class DivCommand extends Command { + /** + * Какое значение прибавить + */ + public double value; + + public DivCommand(State state, double value) { + super(state); + this.value = value; + } + + @Override + public void execute() { + state.addValue(state.curValue() / value); + } +} diff --git a/src/main/java/behavioral/command/operations/MulCommand.java b/src/main/java/behavioral/command/operations/MulCommand.java new file mode 100644 index 0000000..f466218 --- /dev/null +++ b/src/main/java/behavioral/command/operations/MulCommand.java @@ -0,0 +1,24 @@ +package behavioral.command.operations; + +import behavioral.command.Command; +import behavioral.command.State; + +/** + * Умножить число + */ +public class MulCommand extends Command { + /** + * Какое значение прибавить + */ + public double value; + + public MulCommand(State state, double value) { + super(state); + this.value = value; + } + + @Override + public void execute() { + state.addValue(state.curValue() * value); + } +} diff --git a/src/main/java/behavioral/command/operations/SubCommand.java b/src/main/java/behavioral/command/operations/SubCommand.java new file mode 100644 index 0000000..114b45e --- /dev/null +++ b/src/main/java/behavioral/command/operations/SubCommand.java @@ -0,0 +1,24 @@ +package behavioral.command.operations; + +import behavioral.command.Command; +import behavioral.command.State; + +/** + * Вычесть число + */ +public class SubCommand extends Command { + /** + * Какое значение прибавить + */ + public double value; + + public SubCommand(State state, double value) { + super(state); + this.value = value; + } + + @Override + public void execute() { + state.addValue(state.curValue() - value); + } +} diff --git a/src/main/java/creational/builder/CheapComputerBuilder.java b/src/main/java/creational/builder/CheapComputerBuilder.java new file mode 100644 index 0000000..a0c2da3 --- /dev/null +++ b/src/main/java/creational/builder/CheapComputerBuilder.java @@ -0,0 +1,18 @@ +package creational.builder; + +/** + * Реализация + */ +public class CheapComputerBuilder extends ComputerBuilder { + public void buildSystemBlock() { + computer.setSystemBlock("Everest"); + } + + public void buildDisplay() { + computer.setDisplay("CRT"); + } + + public void buildManipulators() { + computer.setManipulators("mouse+keyboard"); + } +} \ No newline at end of file diff --git a/src/main/java/creational/builder/Computer.java b/src/main/java/creational/builder/Computer.java new file mode 100644 index 0000000..ba62b31 --- /dev/null +++ b/src/main/java/creational/builder/Computer.java @@ -0,0 +1,34 @@ +package creational.builder; + +/** + * Компьютер + */ +public class Computer { + private String display = null; + private String systemBlock = null; + private String manipulators = null; + + public String getManipulators() { + return manipulators; + } + + public void setManipulators(String manipulators) { + this.manipulators = manipulators; + } + + public String getDisplay() { + return display; + } + + public void setDisplay(String display) { + this.display = display; + } + + public String getSystemBlock() { + return systemBlock; + } + + public void setSystemBlock(String systemBlock) { + this.systemBlock = systemBlock; + } +} \ No newline at end of file diff --git a/src/main/java/creational/builder/ComputerBuilder.java b/src/main/java/creational/builder/ComputerBuilder.java new file mode 100644 index 0000000..77fe3b6 --- /dev/null +++ b/src/main/java/creational/builder/ComputerBuilder.java @@ -0,0 +1,22 @@ +package creational.builder; + +/** + * Created by gtee on 02.07.2015. + */ +public abstract class ComputerBuilder { + protected Computer computer; + + public Computer getComputer() { + return computer; + } + + public void createNewComputer() { + computer = new Computer(); + } + + public abstract void buildSystemBlock(); + + public abstract void buildDisplay(); + + public abstract void buildManipulators(); +} \ No newline at end of file diff --git a/src/main/java/creational/builder/ComputerBuilderTest.java b/src/main/java/creational/builder/ComputerBuilderTest.java new file mode 100644 index 0000000..8ccb345 --- /dev/null +++ b/src/main/java/creational/builder/ComputerBuilderTest.java @@ -0,0 +1,23 @@ +package creational.builder; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +/** + * Тестируем Builder + */ +public class ComputerBuilderTest { + + @Test + public void test1() { + Director director = new Director(); + director.setComputerBuilder(new CheapComputerBuilder()); + director.constructComputer(); + + Computer computer = director.getComputer(); + assertEquals("CRT", computer.getDisplay()); + assertEquals("Everest", computer.getSystemBlock()); + assertEquals("mouse+keyboard", computer.getManipulators()); + } +} diff --git a/src/main/java/creational/builder/Director.java b/src/main/java/creational/builder/Director.java new file mode 100644 index 0000000..8fa5cca --- /dev/null +++ b/src/main/java/creational/builder/Director.java @@ -0,0 +1,23 @@ +package creational.builder; + +/** + * Created by gtee on 02.07.2015. + */ +public class Director { + private ComputerBuilder computerBuilder; + + public void setComputerBuilder(ComputerBuilder computerBuilder) { + this.computerBuilder = computerBuilder; + } + + public Computer getComputer() { + return computerBuilder.getComputer(); + } + + public void constructComputer() { + computerBuilder.createNewComputer(); + computerBuilder.buildSystemBlock(); + computerBuilder.buildDisplay(); + computerBuilder.buildManipulators(); + } +} diff --git a/src/main/java/creational/singletone/Singletone.java b/src/main/java/creational/singletone/Singletone.java index e06d8f0..874ffae 100644 --- a/src/main/java/creational/singletone/Singletone.java +++ b/src/main/java/creational/singletone/Singletone.java @@ -10,11 +10,15 @@ public class Singletone { // Идентификатор int id = ++count; - // Только изнутри класса можно делать новые объекты + /** + * Конструктор приватный - чтобы получить экземпляр класса нужно обязательно вызвать статический метод instance, + * который заботится о том, что во всей системе есть только один экземпляр класса. + * Только изнутри класса можно делать новые объекты + */ private Singletone() { } - public static Singletone instance() { + public synchronized static Singletone instance() { // Если нет ещё ни одного экземпляра объекта => создаём if (uniqueInstance == null) { uniqueInstance = new Singletone(); diff --git a/src/main/java/factory/Ticket.java b/src/main/java/factory/Ticket.java new file mode 100644 index 0000000..4a56def --- /dev/null +++ b/src/main/java/factory/Ticket.java @@ -0,0 +1,33 @@ +package factory; + +/** + * Билет (объект для фабрики билетов) + */ +public class Ticket { + static int counter = 0; + /** + * Идентификатор - уникальный номер билета + */ + public final int id; + /** + * Цена билета + */ + public final double price; + + /** + * Откуда + */ + public final String origin; + + /** + * ФИО пассажира + */ + public final String name; + + public Ticket(String name, double price, String origin) { + id = ++counter; + this.name = name; + this.origin = origin; + this.price = price; + } +} diff --git a/src/main/java/factory/TicketsFactory.java b/src/main/java/factory/TicketsFactory.java new file mode 100644 index 0000000..6f968ae --- /dev/null +++ b/src/main/java/factory/TicketsFactory.java @@ -0,0 +1,27 @@ +package factory; + +/** + * Касса по продаже билетов содержит определённые настройки + */ +public class TicketsFactory { + private int price; + private String origin; + + /** + * Покупка билета + * + * @param name на имя + * @return Новый билет + */ + public Ticket buyTicket(String name) { + return new Ticket(name, price, origin); + } + + public void setPrice(int price) { + this.price = price; + } + + public void setOrigin(String origin) { + this.origin = origin; + } +} diff --git a/src/test/java/behavioral/command/CommandTest.java b/src/test/java/behavioral/command/CommandTest.java new file mode 100644 index 0000000..1bfb824 --- /dev/null +++ b/src/test/java/behavioral/command/CommandTest.java @@ -0,0 +1,39 @@ +package behavioral.command; + +import behavioral.command.operations.AddCommand; +import behavioral.command.operations.MulCommand; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +/** + * Калькулятор с Undo, Redo + */ +public class CommandTest { + + public static final double EPS = 1e-10; + + /** + * Простейший тест + */ + @Test + public void testSimple() { + State state = new State(); + assertEquals(0.0, state.curValue(), EPS); + assertEquals(1, state.values.size()); + Receiver receiver = new Receiver(state); + AddCommand addCommand = new AddCommand(state, 10); + receiver.action(addCommand); + assertEquals(10.0, state.curValue(), EPS); + assertEquals(2, state.values.size()); + receiver.action(new MulCommand(state, 3)); + assertEquals(10.0 * 3.0, state.curValue(), EPS); + state.undo(); + assertEquals(10.0, state.curValue(), EPS); + state.redo(); + assertEquals(10.0 * 3.0, state.curValue(), EPS); + + addCommand.execute(); + assertEquals(10.0 * 3.0 + 10.0, state.curValue(), EPS); + } +} diff --git a/src/test/java/factory/FactoryTest.java b/src/test/java/factory/FactoryTest.java new file mode 100644 index 0000000..9206347 --- /dev/null +++ b/src/test/java/factory/FactoryTest.java @@ -0,0 +1,33 @@ +package factory; + +import org.junit.Test; + +import static junit.framework.Assert.assertEquals; + +/** + * Демонстрация работы с фабрикой + */ +public class FactoryTest { + /** + * Создание билетов с помощью фабрики + */ + @Test + public void testTicketsFactory() { + TicketsFactory factory = new TicketsFactory(); + // Настраиваем фабрику + factory.setPrice(1000); + factory.setOrigin("Санкт-Петербург"); + + Ticket t1 = factory.buyTicket("Иванов Иван Иванович"); + assertEquals("Номер билета", 1, t1.id); + assertEquals("Стандартная цена билета", 1000.0, t1.price); + assertEquals("Санкт-Петербург", t1.origin); + assertEquals("Иванов Иван Иванович", t1.name); + + Ticket t2 = factory.buyTicket("Петров Пётр Петрович"); + assertEquals("Номер билета", 2, t2.id); + assertEquals("Стандартная цена билета", 1000.0, t2.price); + assertEquals("Санкт-Петербург", t2.origin); + assertEquals("Петров Пётр Петрович", t2.name); + } +} From 1a1b696798d66597f5bc8f9d6afd9c27bd37b557 Mon Sep 17 00:00:00 2001 From: Denis Stepulenok Date: Mon, 20 Mar 2017 22:32:58 +0300 Subject: [PATCH 6/9] =?UTF-8?q?=D0=A8=D0=B0=D0=B1=D0=BB=D0=BE=D0=BD=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B5=D0=BA=D1=82=D0=B8=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D1=8F=20Memento=20=D0=B8=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BC=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D1=80=D0=B8=D0=B8=20=D0=BA?= =?UTF-8?q?=20Singletone?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 5 ++- .../java/behavioral/memento/GameStorage.java | 39 +++++++++++++++++++ src/main/java/behavioral/memento/GameXO.java | 27 +++++++++++++ .../java/behavioral/memento/MementoTest.java | 22 +++++++++++ .../creational/singletone/Singletone.java | 10 ++++- 5 files changed, 101 insertions(+), 2 deletions(-) create mode 100644 src/main/java/behavioral/memento/GameStorage.java create mode 100644 src/main/java/behavioral/memento/GameXO.java create mode 100644 src/main/java/behavioral/memento/MementoTest.java diff --git a/.gitignore b/.gitignore index f9ea204..fe5328e 100644 --- a/.gitignore +++ b/.gitignore @@ -16,4 +16,7 @@ hs_err_pid* JavaPatterns.iml # Maven results -target \ No newline at end of file +target + +# Data files +*.dat \ No newline at end of file diff --git a/src/main/java/behavioral/memento/GameStorage.java b/src/main/java/behavioral/memento/GameStorage.java new file mode 100644 index 0000000..a22e613 --- /dev/null +++ b/src/main/java/behavioral/memento/GameStorage.java @@ -0,0 +1,39 @@ +package behavioral.memento; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.PrintWriter; +import java.util.Scanner; + +import static behavioral.memento.GameXO.SIZE; + +public class GameStorage { + GameXO gameXO; + + public GameStorage(GameXO gameXO) { + this.gameXO = gameXO; + } + + // Сохранение игры + public void save(String fileName) throws FileNotFoundException { + System.out.println("Сохранение в \"" + fileName + "\""); + try (PrintWriter writer = new PrintWriter(new File(fileName))) { + writer.println(SIZE); + char[][] field = gameXO.getField(); + for (char[] row : field) { + for (char cell : row) { + writer.print(cell); + } + writer.println(); + } + } + } + + public void load(String fileName) throws FileNotFoundException { + try (Scanner scan = new Scanner(new File(fileName))) { + scan.nextLine(); + // ... + System.out.println("Чтение файла..."); + } + } +} diff --git a/src/main/java/behavioral/memento/GameXO.java b/src/main/java/behavioral/memento/GameXO.java new file mode 100644 index 0000000..7888c09 --- /dev/null +++ b/src/main/java/behavioral/memento/GameXO.java @@ -0,0 +1,27 @@ +package behavioral.memento; + +/** + * Крестики-нолики + */ +public class GameXO { + static final int SIZE = 3; + // Игровое поле + char field[][] = new char[SIZE][SIZE]; + // Текущий игрок + char player = 'X'; + + public void move(int row, int col) { + // TODO: проверить что клетка пустая + field[row][col] = player; + player = (player == 'X') ? 'O' : 'X'; + checkGameOver(); + } + + private void checkGameOver() { + // TODO: реализовать + } + + public char[][] getField() { + return field; + } +} diff --git a/src/main/java/behavioral/memento/MementoTest.java b/src/main/java/behavioral/memento/MementoTest.java new file mode 100644 index 0000000..0159711 --- /dev/null +++ b/src/main/java/behavioral/memento/MementoTest.java @@ -0,0 +1,22 @@ +package behavioral.memento; + +import org.junit.Assert; +import org.junit.Test; + +import java.io.FileNotFoundException; + +public class MementoTest extends Assert { + + @Test + public void testMemento() throws FileNotFoundException { + GameXO gameXO = new GameXO(); + GameStorage gs1 = new GameStorage(gameXO); + gs1.save("xo_game.dat"); + + // ... + gs1.load("xo_game.dat"); + + + } + +} diff --git a/src/main/java/creational/singletone/Singletone.java b/src/main/java/creational/singletone/Singletone.java index 874ffae..137aa7a 100644 --- a/src/main/java/creational/singletone/Singletone.java +++ b/src/main/java/creational/singletone/Singletone.java @@ -1,12 +1,20 @@ package creational.singletone; /** - * Одиночка + * Одиночка: + * цель: обеспечить чтобы в программе у нас был только один экзепляр + * какого-то класса */ public class Singletone { + // В ДАННОЙ РЕАЛИЗАЦИИ НАМ СЧЁТЧИК НЕ НУЖЕН + // ОН БУДЕТ НУЖЕН ЕСЛИ МЫ СДЕЛАЕМ КОНСТРУКТОР + // НЕ private + // >>> // Считаем количество созданных объектов static int count = 0; + // Один-единственный уникальный экземпляр данного класса static Singletone uniqueInstance; + // <<< // Идентификатор int id = ++count; From b7c9e3a04cdd157b26e863cde49a2b45b5c3fc34 Mon Sep 17 00:00:00 2001 From: Denis Stepulenok Date: Mon, 20 Mar 2017 22:48:39 +0300 Subject: [PATCH 7/9] =?UTF-8?q?=D0=A8=D0=B0=D0=B1=D0=BB=D0=BE=D0=BD=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B5=D0=BA=D1=82=D0=B8=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D1=8F=20Memento=20=D0=B8=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BC=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D1=80=D0=B8=D0=B8=20=D0=BA?= =?UTF-8?q?=20Singletone?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/behavioral/memento/GameXO.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/behavioral/memento/GameXO.java b/src/main/java/behavioral/memento/GameXO.java index 7888c09..17d37f7 100644 --- a/src/main/java/behavioral/memento/GameXO.java +++ b/src/main/java/behavioral/memento/GameXO.java @@ -13,6 +13,7 @@ public class GameXO { public void move(int row, int col) { // TODO: проверить что клетка пустая field[row][col] = player; + // Меняем игрока player = (player == 'X') ? 'O' : 'X'; checkGameOver(); } From e976f7c69d515d968cad68d34b65e2ecdf565d93 Mon Sep 17 00:00:00 2001 From: Denis Stepulenok Date: Fri, 24 Mar 2017 22:37:32 +0300 Subject: [PATCH 8/9] =?UTF-8?q?=D0=A8=D0=B0=D0=B1=D0=BB=D0=BE=D0=BD=D1=8B?= =?UTF-8?q?=20=D0=BF=D1=80=D0=BE=D0=B5=D0=BA=D1=82=D0=B8=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D1=8F=2024.03.2017?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../behavioral/command2/ClearCommand.java | 19 +++++++++ .../java/behavioral/command2/Command.java | 8 ++++ .../behavioral/command2/ErrorCommand.java | 8 ++++ .../java/behavioral/command2/ExitCommand.java | 11 +++++ src/main/java/behavioral/command2/Main.java | 38 +++++++++++++++++ .../java/behavioral/command2/NextCommand.java | 21 ++++++++++ .../behavioral/command2/PrintCommand.java | 20 +++++++++ .../behavioral/observer/AbstractObserver.java | 5 +++ .../behavioral/observer/AbstractSubject.java | 9 ++++ .../java/behavioral/observer/EventKind.java | 5 +++ src/main/java/behavioral/observer/Main.java | 27 ++++++++++++ src/main/java/behavioral/observer/Queue.java | 41 +++++++++++++++++++ src/main/java/behavioral/state/Main.java | 11 +++++ src/main/java/behavioral/state/MySocket.java | 14 +++++++ .../java/behavioral/state/SocketState.java | 41 +++++++++++++++++++ src/main/java/creational/FactoryMethods.java | 12 ++++++ 16 files changed, 290 insertions(+) create mode 100644 src/main/java/behavioral/command2/ClearCommand.java create mode 100644 src/main/java/behavioral/command2/Command.java create mode 100644 src/main/java/behavioral/command2/ErrorCommand.java create mode 100644 src/main/java/behavioral/command2/ExitCommand.java create mode 100644 src/main/java/behavioral/command2/Main.java create mode 100644 src/main/java/behavioral/command2/NextCommand.java create mode 100644 src/main/java/behavioral/command2/PrintCommand.java create mode 100644 src/main/java/behavioral/observer/AbstractObserver.java create mode 100644 src/main/java/behavioral/observer/AbstractSubject.java create mode 100644 src/main/java/behavioral/observer/EventKind.java create mode 100644 src/main/java/behavioral/observer/Main.java create mode 100644 src/main/java/behavioral/observer/Queue.java create mode 100644 src/main/java/behavioral/state/Main.java create mode 100644 src/main/java/behavioral/state/MySocket.java create mode 100644 src/main/java/behavioral/state/SocketState.java create mode 100644 src/main/java/creational/FactoryMethods.java diff --git a/src/main/java/behavioral/command2/ClearCommand.java b/src/main/java/behavioral/command2/ClearCommand.java new file mode 100644 index 0000000..39480ec --- /dev/null +++ b/src/main/java/behavioral/command2/ClearCommand.java @@ -0,0 +1,19 @@ +package behavioral.command2; + +import java.util.List; + +/** + * Очистка списка + */ +public class ClearCommand implements Command { + private List data; + + public ClearCommand(List data) { + this.data = data; + } + + @Override + public void execute() { + data.clear(); + } +} diff --git a/src/main/java/behavioral/command2/Command.java b/src/main/java/behavioral/command2/Command.java new file mode 100644 index 0000000..1fcdf9f --- /dev/null +++ b/src/main/java/behavioral/command2/Command.java @@ -0,0 +1,8 @@ +package behavioral.command2; + +/** + * Команда + */ +public interface Command { + void execute(); +} diff --git a/src/main/java/behavioral/command2/ErrorCommand.java b/src/main/java/behavioral/command2/ErrorCommand.java new file mode 100644 index 0000000..2fc765f --- /dev/null +++ b/src/main/java/behavioral/command2/ErrorCommand.java @@ -0,0 +1,8 @@ +package behavioral.command2; + +public class ErrorCommand implements Command { + @Override + public void execute() { + System.out.println("Wrong command2!"); + } +} diff --git a/src/main/java/behavioral/command2/ExitCommand.java b/src/main/java/behavioral/command2/ExitCommand.java new file mode 100644 index 0000000..9c2045e --- /dev/null +++ b/src/main/java/behavioral/command2/ExitCommand.java @@ -0,0 +1,11 @@ +package behavioral.command2; + +/** + * Выход из программы + */ +public class ExitCommand implements Command { + @Override + public void execute() { + System.exit(0); + } +} diff --git a/src/main/java/behavioral/command2/Main.java b/src/main/java/behavioral/command2/Main.java new file mode 100644 index 0000000..02de628 --- /dev/null +++ b/src/main/java/behavioral/command2/Main.java @@ -0,0 +1,38 @@ +package behavioral.command2; + +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +/** + * Генератор случайных чисел + */ +public class Main { + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + + List list = new ArrayList<>(); + + while (scanner.hasNextLine()) { + Command command = readCommand(scanner, list); + command.execute(); + } + } + + private static Command readCommand(Scanner scanner, List list) { + String line = scanner.nextLine(); + if (line.equalsIgnoreCase("exit")) { + return new ExitCommand(); + } else if (line.equalsIgnoreCase("next")) { + return new NextCommand(list); + } else if (line.equalsIgnoreCase("print")) { + return new PrintCommand(list); + } else if (line.equalsIgnoreCase("clear")) { + return new ClearCommand(list); + } else { + new ErrorCommand(); + } + + return new ErrorCommand(); + } +} diff --git a/src/main/java/behavioral/command2/NextCommand.java b/src/main/java/behavioral/command2/NextCommand.java new file mode 100644 index 0000000..45ebc43 --- /dev/null +++ b/src/main/java/behavioral/command2/NextCommand.java @@ -0,0 +1,21 @@ +package behavioral.command2; + +import java.util.List; +import java.util.Random; + +/** + * Сгенерировать следующее число + */ +public class NextCommand implements Command { + private static Random random = new Random(); + private List acceptor; + + public NextCommand(List acceptor) { + this.acceptor = acceptor; + } + + @Override + public void execute() { + acceptor.add(random.nextInt()); + } +} diff --git a/src/main/java/behavioral/command2/PrintCommand.java b/src/main/java/behavioral/command2/PrintCommand.java new file mode 100644 index 0000000..b238f3c --- /dev/null +++ b/src/main/java/behavioral/command2/PrintCommand.java @@ -0,0 +1,20 @@ +package behavioral.command2; + +import java.util.List; + +/** + * Напечатать список чисел + */ +public class PrintCommand implements Command { + + private List list; + + public PrintCommand(List list) { + this.list = list; + } + + @Override + public void execute() { + System.out.println(list); + } +} diff --git a/src/main/java/behavioral/observer/AbstractObserver.java b/src/main/java/behavioral/observer/AbstractObserver.java new file mode 100644 index 0000000..b90a4a1 --- /dev/null +++ b/src/main/java/behavioral/observer/AbstractObserver.java @@ -0,0 +1,5 @@ +package behavioral.observer; + +public interface AbstractObserver { + void update(EventKind kind, T data); +} diff --git a/src/main/java/behavioral/observer/AbstractSubject.java b/src/main/java/behavioral/observer/AbstractSubject.java new file mode 100644 index 0000000..6dbfc57 --- /dev/null +++ b/src/main/java/behavioral/observer/AbstractSubject.java @@ -0,0 +1,9 @@ +package behavioral.observer; + +public interface AbstractSubject { + void attach(AbstractObserver observer); + + void detach(AbstractObserver observer); + + void notifyObservers(EventKind kind, T data); +} diff --git a/src/main/java/behavioral/observer/EventKind.java b/src/main/java/behavioral/observer/EventKind.java new file mode 100644 index 0000000..d67bac1 --- /dev/null +++ b/src/main/java/behavioral/observer/EventKind.java @@ -0,0 +1,5 @@ +package behavioral.observer; + +public enum EventKind { + CREATE, UPDATE, DELETE +} diff --git a/src/main/java/behavioral/observer/Main.java b/src/main/java/behavioral/observer/Main.java new file mode 100644 index 0000000..1fb9c92 --- /dev/null +++ b/src/main/java/behavioral/observer/Main.java @@ -0,0 +1,27 @@ +package behavioral.observer; + +public class Main { + public static void main(String[] args) { + Queue queue = new Queue(); + queue.attach(new AbstractObserver() { + @Override + public void update(EventKind kind, Integer data) { + System.out.println("Changed: " + kind + " " + data); + } + }); + queue.attach(new AbstractObserver() { + @Override + public void update(EventKind kind, Integer data) { + if (kind == EventKind.CREATE) { + System.out.println("Observer 2: create " + data); + } + } + }); + + queue.push(1); + queue.push(2); + queue.push(3); + queue.poll(); + queue.poll(); + } +} diff --git a/src/main/java/behavioral/observer/Queue.java b/src/main/java/behavioral/observer/Queue.java new file mode 100644 index 0000000..9801ec7 --- /dev/null +++ b/src/main/java/behavioral/observer/Queue.java @@ -0,0 +1,41 @@ +package behavioral.observer; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + +public class Queue implements AbstractSubject { + + private LinkedList list = new LinkedList<>(); + + + private List> observers = new ArrayList<>(); + + public void push(int value) { + list.push(value); + notifyObservers(EventKind.CREATE, value); + } + + public int poll() { + Integer polled = list.poll(); + notifyObservers(EventKind.DELETE, polled); + return polled; + } + + @Override + public void attach(AbstractObserver observer) { + observers.add(observer); + } + + @Override + public void detach(AbstractObserver observer) { + observers.remove(observer); + } + + @Override + public void notifyObservers(EventKind kind, Integer data) { + for (AbstractObserver observer : observers) { + observer.update(kind, data); + } + } +} diff --git a/src/main/java/behavioral/state/Main.java b/src/main/java/behavioral/state/Main.java new file mode 100644 index 0000000..e4cd38b --- /dev/null +++ b/src/main/java/behavioral/state/Main.java @@ -0,0 +1,11 @@ +package behavioral.state; + +public class Main { + public static void main(String[] args) throws Exception { + MySocket socket = new MySocket(); + + socket.send("Send"); + socket.close(); + socket.send("Send2"); + } +} diff --git a/src/main/java/behavioral/state/MySocket.java b/src/main/java/behavioral/state/MySocket.java new file mode 100644 index 0000000..875dd85 --- /dev/null +++ b/src/main/java/behavioral/state/MySocket.java @@ -0,0 +1,14 @@ +package behavioral.state; + +public class MySocket { + private SocketState state = SocketState.OPENED; + + public void close() throws Exception { + state.handleClose(); + state = SocketState.CLOSED; + } + + public void send(Object object) throws Exception { + state.handleSend(object); + } +} diff --git a/src/main/java/behavioral/state/SocketState.java b/src/main/java/behavioral/state/SocketState.java new file mode 100644 index 0000000..8496289 --- /dev/null +++ b/src/main/java/behavioral/state/SocketState.java @@ -0,0 +1,41 @@ +package behavioral.state; + +public interface SocketState { + + SocketState OPENED = new SocketState() { + @Override + public void handleSend(Object object) { + System.out.println("sent..."); + } + + @Override + public void handleClose() { + System.out.println("close..."); + } + }; + SocketState CLOSED = new SocketState() { + @Override + public void handleSend(Object object) throws Exception { + throw new Exception("Socket closed"); + } + + @Override + public void handleClose() { + } + }; + SocketState BROKEN = new SocketState() { + @Override + public void handleSend(Object object) throws Exception { + throw new Exception("Socket broken"); + } + + @Override + public void handleClose() throws Exception { + throw new Exception("Socket broken"); + } + }; + + void handleSend(Object object) throws Exception; + + void handleClose() throws Exception; +} diff --git a/src/main/java/creational/FactoryMethods.java b/src/main/java/creational/FactoryMethods.java new file mode 100644 index 0000000..70f2bb1 --- /dev/null +++ b/src/main/java/creational/FactoryMethods.java @@ -0,0 +1,12 @@ +package creational; + +import java.util.concurrent.Executors; + +/** + * Фабричные методы + */ +public class FactoryMethods { + public static void main(String[] args) { + Executors.newCachedThreadPool(); + } +} From 0c5726f987f1a658d0fadf44db6eb5e063689ae9 Mon Sep 17 00:00:00 2001 From: Denis Stepulenok Date: Fri, 24 Mar 2017 22:45:42 +0300 Subject: [PATCH 9/9] =?UTF-8?q?=D0=9E=D1=82=D1=84=D0=BE=D1=80=D0=BC=D0=B0?= =?UTF-8?q?=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=20=D1=81=D0=BF=D0=B8?= =?UTF-8?q?=D1=81=D0=BE=D0=BA=20=D1=88=D0=B0=D0=B1=D0=BB=D0=BE=D0=BD=D0=BE?= =?UTF-8?q?=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 6301ac6..79df427 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,9 @@ Классификация шаблонов ---------------------- -* Поведенческие (behavioral) + +**Поведенческие (behavioral)** + * Цепочка ответственности (Chain of responsibilily) * Команда (Command) * Интерпретатор (Interpreter) @@ -26,7 +28,9 @@ * Стратегия (Strategy) * Шаблонный метод (Template method) * Посетитель (Visitor) -* Порождающие (creational) - абстрагируют процесс инстанцирования (создания) объекта + +**Порождающие (creational)** - абстрагируют процесс инстанцирования (создания) объекта + * Одиночка (singleton) - класс, который может иметь только один экземпляр * Абстрактная фабрика (Abstract factory) - класс, который представляет собой интерфейс для создания компонентов системы * Строитель (Builder) @@ -36,7 +40,9 @@ * Объектный пул (Object pool) * Прототип (Prototype) - определяет интерфейс создания объекта через клонирование другого объекта вместо создания через конструктор * Получение ресурса есть инициализация Resource acquisition is initialization (RAII) - получение некоторого ресурса совмещается с инициализацией, а освобождение — с уничтожением объекта. -* Структурные (structural) + +**Структурные (structural)** + * Адаптер (Adapter) - обеспечивает взаимодействие двух других объектов, один из которых использует, а другой предоставляет несовместимый с первым интерфейс * Мост (Bridge) - структура, позволяющая изменять интерфейс обращения и интерфейс реализации класса независимо * Компоновщик (Composite)