> For the complete documentation index, see [llms.txt](https://www.saladpuk.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://www.saladpuk.com/software-design/designpatterns.md).

# 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 %}
