Skip to content

Commit 6010bc6

Browse files
committed
added builder, prototype and singleton patterns
1 parent fb567a1 commit 6010bc6

File tree

5 files changed

+134
-22
lines changed

5 files changed

+134
-22
lines changed

README.md

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,21 @@
11
# Шаблоны проектирования
22

3-
Здесь описаны в общей сумме 17 паттернов: порождающие, структурные и поведенческие.
4-
5-
1. Порождающие паттерны:
6-
1.1. Singleton (Одиночка)
7-
1.2. Prototype (Прототип)
8-
1.3. Builder (Строитель)
9-
1.4. Factory (Фабрика)
10-
2. Структурные паттерны:
11-
2.1. Bridge (Мост)
12-
2.2. Facade (Фасад)
13-
2.3. Adapter (Адаптер)
14-
2.4. Proxy (Прокси)
15-
2.5. Composite (Композит)
16-
3. Поведенческие паттерны:
17-
3.1. Chain of Command
18-
3.2. Mediator
19-
3.3. Command
20-
3.4. State
21-
3.5. Strategy
22-
3.6. Iterator
23-
3.7. Template
24-
3.8. Observer
3+
Шаблоны проектирования помогают нам унифицировать код под уже существующие лучшие практики. Используя нужный шаблон проектирования в определёной ситуации формирует стерильный код. Здесь описаны в общей сумме 17 паттернов: порождающие, структурные и поведенческие.
4+
5+
## Оглавление
6+
- [Шаблоны проектирования](#шаблоны-проектирования)
7+
- [Оглавление](#оглавление)
8+
- [Порождающие паттерны](#порождающие-паттерны)
9+
- [Singleton (Одиночка)](#singleton-одиночка)
10+
- [Prototype (Прототип)](#prototype-прототип)
11+
- [Builder (Строитель)](#builder-строитель)
12+
- [Factory (Фабрика)](#factory-фабрика)
13+
- [Структурные паттерны:](#структурные-паттерны)
14+
- [Bridge (Мост)](#bridge-мост)
15+
- [Facade (Фасад)](#facade-фасад)
16+
- [Adapter (Адаптер)](#adapter-адаптер)
17+
- [Proxy (Прокси)](#proxy-прокси)
18+
- [Composite (Композит)](#composite-композит)
2519

2620
## Порождающие паттерны
2721

@@ -32,22 +26,30 @@
3226
Данный шаблон необходимо применять, когда необходим лишь один экземпляр класса, например для методов, которые описывают конфигурацию или создают CRUDGeneric класс. <br/> <br/>
3327
Суть паттерна - описывать методы класса через модификаторы *public* и *static*. Таким образом с помощью модификатора *public* методы будут доступны всем, а модификатор *static*, позволяет получать доступ к методам класса без создаеия экземпляра класса.
3428

29+
Пример реализации: [Singleton](creational_patterns/Singleton.ts)
30+
3531
### Prototype (Прототип)
3632

3733
Данный шаблон применяется когда необходимо склонировать полностью другой класс не углубляюсь в реализацию этого класса. <br/> <br/>
3834
Суть паттерна - создать метод внутри класса, который позволяет полностью скоппировать другой класс.
3935

36+
Пример реализации: [Prototype](creational_patterns/Prototype.ts)
37+
4038
### Builder (Строитель)
4139
Данный шаблон применяется, когда необходимо создавать большие объекты с разными конфигурациями или фильтрами. Отличный пример это объект позволяющий сделать объект запроса к базе данных. <br/> <br/>
4240
Суть паттерна - создать большое количество простых методов, через модификатор *public*, которые можно будет последовательно через точку реализовывать на объекте. Например методы фильтрации данных приходящих из базы данных.
4341

42+
Пример реализации: [Builder](creational_patterns/Builder.ts)
43+
4444
### Factory (Фабрика)
4545
Данный шаблон применяется при создании возможности на основе базового класса создавать разные системы, которые подключаются к базовому классу через единый базовый интерфейс этого класса. <br/> <br/>
4646
Суть паттерна - создать базовый класс системы и описать API к подключению этой системы, после чего от этого базового класса системы наследовать все методы API для подключения и описания конкретной другой системы.
4747
Примеры реализации: <br/>
4848
1. Система отправки товара интернет-магазина, как базовая система со своим API, от которой могут наследоватся системы описывающее реализацию отправку Новой Почтой, Укрпочтой, или отправка курьером. <br/> <br/>
4949
2. Система страхования, которая является базовым классом API и от которой наследуются классы описывающее разные виды страховых компаний, которыми может воспользоватся пользователь: например система MetLife, Спутник или Alicoaglife.
5050

51+
Пример реализации: [Factory](creational_patterns/Factory.ts)
52+
5153
## Структурные паттерны:
5254

5355
Структурные паттерны - это шаблоны проектирования, которые типизируют структурирования кода.

creational_patterns/Builder.ts

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
enum ImageFormat {
2+
Png = 'png',
3+
Jpeg = 'jpeg'
4+
}
5+
6+
interface IResolution {
7+
width: number;
8+
height: number
9+
}
10+
11+
interface IImageConversion extends IResolution {
12+
format: ImageFormat
13+
}
14+
15+
class ImageBuilder {
16+
private formats: ImageFormat[] = []
17+
private resolutions: IResolution[] = []
18+
19+
addPng() {
20+
if (this.formats.includes(ImageFormat.Png)) {
21+
return this
22+
}
23+
this.formats.push(ImageFormat.Png);
24+
return this
25+
}
26+
27+
addJpeg() {
28+
if (this.formats.includes(ImageFormat.Jpeg)) {
29+
return this
30+
}
31+
this.formats.push(ImageFormat.Jpeg);
32+
return this
33+
}
34+
35+
addResolution(width: number, height: number) {
36+
this.resolutions.push({ width, height})
37+
return this
38+
}
39+
40+
build(): IImageConversion[] {
41+
const res: IImageConversion[] = []
42+
for (const r of this.resolutions) {
43+
for (const f of this.formats) {
44+
res.push({
45+
format: f,
46+
width: r.width,
47+
height: r.height
48+
})
49+
}
50+
}
51+
return res
52+
}
53+
}

creational_patterns/Factory.ts

Whitespace-only changes.

creational_patterns/Prototype.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
interface Prototype<T> {
2+
clone(): T
3+
}
4+
5+
class UserHistory implements Prototype<UserHistory> {
6+
createdAt: Date;
7+
constructor(public email: string, public name: string) {
8+
this.createdAt = new Date();
9+
}
10+
11+
clone(): UserHistory {
12+
let target = new UserHistory(this.email, this.name);
13+
target.createdAt = this.createdAt;
14+
return target
15+
}
16+
}
17+
18+
let user = new UserHistory('vladislav.pestsov@gmail.com', 'Vladislav')
19+
console.log(user);
20+
let user2 = user.clone()
21+
console.log(user2)

creational_patterns/Singleton.ts

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
class MyMap {
2+
private static instance: MyMap
3+
map: Map<number, string> = new Map ()
4+
5+
private constructor() {}
6+
7+
clean() {
8+
this.map = new Map()
9+
}
10+
11+
public static get(): MyMap {
12+
if (!MyMap.instance) {
13+
MyMap.instance = new MyMap()
14+
}
15+
return MyMap.instance
16+
}
17+
}
18+
19+
class Service1 {
20+
addMap(key: number, value: string) {
21+
const myMap = MyMap.get();
22+
myMap.map.set(key, value)
23+
}
24+
}
25+
26+
class Service2 {
27+
getKeys(key: number) {
28+
const myMap = MyMap.get();
29+
console.log(myMap.map.get(key))
30+
myMap.clean()
31+
console.log(myMap.map.get(key))
32+
}
33+
}
34+
35+
new Service1().addMap(1, 'Working!')
36+
new Service2().getKeys(1)

0 commit comments

Comments
 (0)