پیش نیاز: ویدیو آموزش متاکلاس‌ها در پایتون

 

Singleton یک الگوی طراحی از نوع creational است که به شما امکان می دهد اطمینان حاصل کنید که از یک کلاس فقط بتوان یک آبجکت ایجاد کرد و دسترسی global به این آبجکت وجود داشته باشد.

 

 

# پیاده سازی الگوی Singleton

تمام پیاده سازی های Singleton دارای این دو مرحله مشترک هستند:

 

  1. سازنده کلاس(constructor) را در حالت خصوصی قرار داده تا از خارج کلاس نتوان به آن دسترسی داشت.
  2. یک متد معمولا با نام get_instance ایجاد کرده که به عنوان جایگزین سازنده استفاده میشود. در این متد، سازنده خصوصی را صدا زده و آبجکت برگشتی را در یک متغیر ذخیره میکنیم. سپس در فراخوانی‌های بعدی کلاس، آبجکت ذخیره شده در متغیر را برمیگردانیم.

 

اگر کد شما به کلاس Singleton دسترسی دارد، می‌تواند متد Singleton را فراخوانی کند. بنابراین هر زمان که آن متد فراخوانی شود، همیشه همان شی برگردانده می شود.



0

intro

4:28

رایگان

1

Singleton

13:3

رایگان

2

Factory

17:9

4

Prototype

12:39

5

Builder

18:8

6

Adapter

8:31

7

Decorator

15:6

8

Facade

10:4

9

Proxy

11:36

10

Composite

16:10

11

Bridge

19:14

13

Command

21:2

14

Observer

13:17

15

Mediator

19:34

16

Template Method

8:28

17

Strategy

10:32

18

State

14:26

19

Memento

26:14

20

Visitor

18:57

دوره های پیشنهادی

دوره آموزش طراحی پایگاه داده(database)
دوره آموزش طراحی پایگاه داده(database)
تکمیل ضبط
امیرحسین بیگدلو
دوره آموزش nginx
دوره آموزش nginx
تکمیل ضبط
امیرحسین بیگدلو
دوره آموزش داکر docker
دوره آموزش داکر docker
تکمیل ضبط
امیرحسین بیگدلو



ارسال نظر


امیر

2 سال قبل پاسخ به نظر

سلام.
بهتر نبود برای پیاده سازی این دیزاین پترن از روش زیر استفاده می کردید که راحتر باشه و درگیر مفاهیم متا کلاس ها نشیم.

class Singleton:
__instance = None

def __new__(cls, *args, **kwargs):
if not isinstance(cls.__instance, cls):
cls.__instance = super().__new__(cls, *args, **kwargs)
return cls.__instance
return cls.__instance

ارسال نظر



علیزاده

2 سال قبل پاسخ به نظر

با سلام و عرض خسته نباشید.
لازم است اولا از آموزش های بی نظیر شما واقعا تقدیر و تشکر کنم و در مورد یک موضوعی که فکر می کنم خوب متوجه نشده ام، در این بین از شما راهنمایی بگیرم.
جناب آقای بیگدلو، شما در دوره تک قسمتی __call__ فرمودید که این تابع زمانی فراخوانی میشه که اگر یک نمونه از کلاس ساخته شده به صورت تابع فراخوانی شود، __call__ اجرا خواهد شد.
ولی اینجا (همین آموزش) یک سوالی پیش می آید که قبل از اجرای پرینت ها ذاتا نمونه ها ساخته شده اند و بعدا در دستورات پرینت نمونه ها به شکل تابع فراخوانی کرده ایم.
آیا نباید قبل از اجرای دستورات پرینت __call__ اجرا می شد؟ هر چند به نظرم حتما اجرا شده که نگذاشته از یک کلاس چندین نمونه متفاوت تولید شود.
آیا به نظرتان __call__ به غیر از زمان فراخوانی نمونه ها به شکل تابع، در زمان ایجاد نمونه ها هم خودبخود ایجاد می شود؟
یا اصلا نکته خاصی در این موضوع است که بنده متوجه آن نیستم.
در این مورد راهنمایی بفرمایید متشکر می شوم.
با تشکر

ارسال نظر



امیرحسین بیگدلو

2 سال قبل

سلام
در متاکلاس اگر __new__ نباشه متد __call__ صدا زده میشه.
دقت کن که در زمان فراخوانی کلاس __call__ فراخوانی میشه و نه در زمان فراخوانی آبجکت.
مثلا در کد ما هر بار که کلاس db رو صدا بزنید یکبار __call__ متاکلاس فعال میشه اما اگر آبجکت های d1, d2, d3 رو صدا بزنید متد __call__ فعال نمیشه.

محمدرضا

2 سال قبل پاسخ به نظر

سلام خسته نباشید
زمان این ویدیو اشتباه خورده ، گفتم اطلاع بدم

ارسال نظر



امیرحسین بیگدلو

2 سال قبل

سلام
ممنون

mobiniqow

3 سال قبل پاسخ به نظر

سلام وقت بخیر واقعا اموزش پرباریه

میشه اصول solid رو هم بزارید

ارسال نظر



امیرحسین بیگدلو

3 سال قبل

سلام
این لینک رو یه نگاه بنداز:
https://www.mongard.ir/one_part/tag/solid/

مونگارد