سلاام شب خوش
سوالم اینه که آیا لیزی پراکسی میتونه برای ما همون کار سینگلتون رو انجام بده؟ چون وقتی یه بار ابجکت رو میسازه دیگه نمیره اینیشیتش نمیکنه و همون یدونه ازش و میسازه
سلااااااااااااااااااام امین جان
وقت تون بخیر
برای پاسخ به سوال تون فک میکنم بهتره به مفهموم الگوهای طراحی (Design Patterns) برگردیم. تو برنامه نویسی یه سری مسائل داریم که زیاد تکرار میشن. برای هر مساله یه راه حل بهینه (Best practice) ارائه میدن و یه اسم روی اون راه حل میذارن.
مثلا یه کلاسی داریم که میخواهیم ازش یه ابجکت بیشتر ساخته نشه. یه راه حل برای این قضیه ارائه دادن و اسمش رو گذاشتن Singleton.
تو توسعه نرم افزار خیلی مهمه که درست تشخیص بدیم مساله چی هست و مساله رو درست بفهمیم. اگر اون مساله جزو مسائلی بود که تو الگوهای طراحی داشتیم، میتونیم از راه حل های الگوهای طراحی استفاده کنیم. و باید دقت کنیم که درست تشخیص بدیم. مثلا تشخیص بدیم این مساله همون مساله ای هست که براش راه حل پروکسی ارائه شده یا اون مساله ای هست که براش راه حل دکوریتور ارائه شده. احتمال زیادی وجود داره که اگر از الگوی طراحی اشتباه استفاده بشه بعدا به مشکلاتی بخوریم. مثلا توسعه سخت تر بشه. یا به بن بست بخوریم.
جواب سوالتون:
خیر، این کلاس LazyLoader که استاد نوشتن کار سینگلتون رو انجام نمیداد. به مثال زیر دقت کنید:
from time import sleep
class LazyLoader:
def __init__(self, cls):
self.cls = cls
self.object = None
def __getattr__(self, item):
if self.object is None:
self.object = self.cls()
return getattr(self.object, item)
class MySQLHandler:
def __init__(self):
sleep(1)
def connect(self):
return "Connection to the mysql stablished"
if __name__ == "__main__":
mysql = LazyLoader(MySQLHandler)
mysql2 = LazyLoader(MySQLHandler)
print(mysql.connect(), id(mysql))
print(mysql2.connect(), id(mysql2))
الگوی طراحی سینگلتون قرار بود جلوی دوباره ساخته شدن ابجکت از یه کلاس رو بگیره، طبق این تعریف کد بالا پیاده سازی الگوی سینگلتون نیست.
میتونیم کلاس LazyLoader رو جوری بنویسیم که کار سینگلتون رو هم بکنه. ولی طبق توضیحاتی که بالا دادم، انجام این کار اشتباهه. باید مساله رو درست تشخیص بدیم و بفهمیم، و الگوی طراحی مناسب مساله مون رو انتخاب کنیم.
اینکه هر جا به مساله ای میخوریم دنبال یه الگوی طراحی بگردیم و یه جور برای مساله مون اون الگو رو پیاده کنیم هم اشتباهه. باید تعریف مساله ما مثل تعریف مساله اون الگوی طراحی باشه.
امیدوارم با این توضیحات به جواب سوالت رسیده باشی.
باز اگر سوالی داشتی در خدمتم :)