# Design Patterns

## ❓ มันคืออะไร ?

**Design patterns** เป็นแนวคิดในการแก้ปัญหาที่เราเจอบ่อยๆในการออกแบบซอฟต์แวร์ ซึ่งถ้าเรามี `ปัญหา` แล้วปัญหานั้นมีลักษณะตรงกับ `pattern` ไหนก็ตาม เราก็จะสามารถนำแนวคิดของ pattern นั้นๆไปแก้ปัญหาของเราได้เลย

**Pattern** แต่ละตัวจะเป็นแค่ `แนวคิดในการแก้ไขปัญหา` เท่านั้น ซึ่งมันไม่ได้บอกชัดเจนว่าเราต้องมีทำอะไรบ้างเพื่อจะแก้ปัญหาที่เจอ ดังนั้นวิธีการแก้ปัญหาที่เจอจะขึ้นกับการตัดสินใจของ developer เอง

## 😒 ข้อดีข้อเสีย

### 👍 ข้อดี

* เมื่อเกิดปัญหาในการออกแบบซอฟต์แวร์ สามารเอา pattern มาแก้ปัญหาได้เลย
* สามารถรับมือเมื่อเจอกับ business requirement ที่ซับซ้อนได้
* ลดการเกิด coupling, โค้ดยืดหยุ่นขึ้น, โค้ดนำกลับมาใช้ใหม่ได้

### 👎 ข้อเสีย

* Design pattern แต่ละตัวไม่ได้เข้าใจง่ายสำหรับ developer มือใหม่
* Developer ส่วนใหญ่จะนำ design pattern ไปใช้เลย โดยไม่ได้ชั่งน้ำหนักก่อนใช้ให้ดีก่อน ทำให้โค้ดมีความซับซ้อนเพิ่มขึ้นโดยไม่จำเป็น

{% hint style="danger" %}
**คำเตือน**\
การนำ design pattern ไปใช้ไม่ใช่เรื่องเท่ เพราะมันมี cost (memory, processing overhead & complexity) ของมันค่อนข้างสูง ดังนั้นก่อนใช้ให้ **ชั่งน้ำหนัก ข้อดี/ข้อเสีย** ให้ดีก่อน ไม่งั้นโค้ดจะทำงานได้แต่ maintenance ยากขึ้นโดยใช่เหตุ **ดังนั้นอย่าเมากาวแล้วตะบี้ตะบันเอา pattern ไปใช้เลยตลอดเวลา** (อาตตามาเตือนแล้วนะ)
{% endhint %}

## 👑 กลุ่มของ patterns ต่างๆ

Pattern ทั้งหมดถูกแบ่งออกเป็น 3 กลุ่ม ตามวัตถุประสงค์ในการแก้ไขปัญหาของมัน โดยแต่ละกลุ่มจะช่วยให้โค้ดนั้น ลดการเกิด coupling, มีความยืดหยุ่นขึ้นและนำกลับมาใช้ใหม่ได้

### 🦈 **Creational patterns**

> ช่วยในการออกแบบเมื่อจะสร้าง object ต่างๆ

{% content-ref url="/pages/-LmQRBv7-Zpqkpfe17Vu" %}
[Abstract Factory](/software-design/designpatterns/creational-patterns/abstract-factory.md)
{% endcontent-ref %}

{% content-ref url="/pages/-LmQS-DLgCQ9zg38XkdY" %}
[Builder](/software-design/designpatterns/creational-patterns/builder.md)
{% endcontent-ref %}

{% content-ref url="/pages/-LmQScvU0l0GOJHudJ6U" %}
[Factory Method](/software-design/designpatterns/creational-patterns/factory-method.md)
{% endcontent-ref %}

{% content-ref url="/pages/-LmQT4w4WgqhK4zONmKC" %}
[Prototype](/software-design/designpatterns/creational-patterns/prototype.md)
{% endcontent-ref %}

{% content-ref url="/pages/-LmQTjL4E8nyIekFkeVc" %}
[Singleton](/software-design/designpatterns/creational-patterns/singleton.md)
{% endcontent-ref %}

### 🦈 **Structural patterns**

> ช่วยในการออกแบบโครงสร้างของ class ต่างๆ

{% content-ref url="/pages/-LmQUcZBk6SUKBsZKeKT" %}
[Adapter](/software-design/designpatterns/structural-patterns/adapter.md)
{% endcontent-ref %}

{% content-ref url="/pages/-LmQVD6AmNo205KLJwqF" %}
[Bridge](/software-design/designpatterns/structural-patterns/bridge.md)
{% endcontent-ref %}

* ~~Composite pattern~~

{% content-ref url="/pages/-LmQVf7nRdSwRrMmR45n" %}
[Decorator](/software-design/designpatterns/structural-patterns/decorator.md)
{% endcontent-ref %}

{% content-ref url="/pages/-LmQW1OBXARXLcimjiKq" %}
[Facade](/software-design/designpatterns/structural-patterns/facade.md)
{% endcontent-ref %}

* ~~Flyweight pattern~~

{% content-ref url="/pages/-LmQWNY9kyAY3bOqq0XG" %}
[Proxy](/software-design/designpatterns/structural-patterns/proxy.md)
{% endcontent-ref %}

### 🦈 **Behavioral patterns**&#x20;

> ช่วยในการออกแบบให้ class ต่างๆทำงานร่วมกัน

{% content-ref url="/pages/-LmQWmtfdFeHCBq3VJLT" %}
[Chain of Responsibility](/software-design/designpatterns/behavioral-patterns/chain-of-responsibility.md)
{% endcontent-ref %}

{% content-ref url="/pages/-LmQX9WuDp5eUz0ZQ5E3" %}
[Command](/software-design/designpatterns/behavioral-patterns/command.md)
{% endcontent-ref %}

* ~~Interpreter pattern~~

{% content-ref url="/pages/-LmQXaierBRaN1T6ZJii" %}
[Iterator](/software-design/designpatterns/behavioral-patterns/iterator.md)
{% endcontent-ref %}

{% content-ref url="/pages/-LmQXrAOSN16rijwlrDm" %}
[Mediator](/software-design/designpatterns/behavioral-patterns/mediator.md)
{% endcontent-ref %}

{% content-ref url="/pages/-LmQYAoVC4\_FZANJTOFf" %}
[Memento](/software-design/designpatterns/behavioral-patterns/memento.md)
{% endcontent-ref %}

{% content-ref url="/pages/-LmQYOt8lvLDn8hPkj3m" %}
[Observer](/software-design/designpatterns/behavioral-patterns/observer.md)
{% endcontent-ref %}

{% content-ref url="/pages/-LmQYfAbJX2NZLG5dVgZ" %}
[State](/software-design/designpatterns/behavioral-patterns/state.md)
{% endcontent-ref %}

{% content-ref url="/pages/-LmQYyzsOLkTezAyQGBs" %}
[Strategy](/software-design/designpatterns/behavioral-patterns/strategy.md)
{% endcontent-ref %}

{% content-ref url="/pages/-LmQZDRdTFk9jdGsKd18" %}
[Template Method](/software-design/designpatterns/behavioral-patterns/template-method.md)
{% endcontent-ref %}

{% content-ref url="/pages/-LmQZTzEeV2QZgDS7oEw" %}
[Visitor](/software-design/designpatterns/behavioral-patterns/visitor.md)
{% endcontent-ref %}

{% hint style="warning" %}
ตัว pattern ที่เหลือโอกาสใช้มันค่อนข้างต่ำมากถ้ามีเวลาผมจะมาทำต่อนะครับ
{% endhint %}

{% hint style="info" %}
เนื้อหานี้ผมเคยเขียนครั้งแรกไว้ที่ Github ถ้าสนใจก็เข้าไปดูได้จากลิงค์ด้านล่างนี้เลยนะครับ\
<https://github.com/saladpuk/design-patterns>
{% endhint %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://www.saladpuk.com/software-design/designpatterns.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
