1.1. Static Factory¶
1.1.1. تعریف¶
الگوی Static Factory یکی از انواع الگوهای Creational یا سازنده محسوب میشه که کارش در نهایت ایجاد شی هست.
در این الگو کلاسی رو تعریف می کنیم که مسئولیتش ایجاد شی از کلاس های دیگه با توجه به پارامتر ورودی هست، اشیاء ایجاد شده هم همیشه کلاس والد مشخصی دارن.
تفاوتش با انواع دیگه ی الگوهای Factory این هست که اینجا فقط یک متد static داریم که تمام انواع آبجکت ها رو ایجاد می
کنه که معمولا هم اسمش factory یا build هست.
1.1.2. چه زمانی استفاده میشه؟¶
این الگو زمانی استفاده میشه که قصد داریم نحوه ایجاد شی از کلاس رو از دید کلاس های رده بالاتر در برنامه پنهان کنیم.
معمول ترین سناریو هایی که از این الگو استفاده می کنیم:
ایجاد شی پیچیده هست و نیاز به کدهای زیادی برای انجام تنظیمات و… وجود داره
ایجاد شی بستگی به یک متغیر داره: در شرایط و با توجه به condition های مختلف خروجی متفاوتی رو از factory انتظار داریم.
ایجاد شی همراه با کش: این الگو کش کردن شی خروجی رو هم ساده تر می کنه
ایجاد شی منوط به پیاده سازی کردن interface مشخص
1.1.3. کاربرد عملی¶
فرض کنید در حال کار رو روی برنامه ای هستیم که امکان پردازش انواع مختلف داده رو داره. داده هایی در فرمت های مختلف CSV، JSON، XML و…
حالا در برنامه قصد دارید آبجکتی ایجاد کنید که امکان پردازش این داده رو با توجه به فرمت مشخص شده داشته باشه. در عین حال کلاس والد نباید از نحوه ی ایجاد اشیاء از کلاس های پردازش گر مطلع باشه
1.1.4. پیاده سازی¶
برای پیاده سازی این الگو ابتدا یک interface یا abstract تعریف می کنیم که مشخص کننده ی عملکرد آبجکتی هست که قراره تولید بشه:
1<?php
2
3interface DataReader
4{
5 public function readData(string $filename): array;
6}
و بعد مشخص می کنیم که امکان پردازش چه نوع فرمت هایی رو داریم:
1<?php
2
3class CsvReader implements DataReader
4{
5 public function readData(string $filename): array
6 {
7 // Read and process data from CSV file
8 // Return data in a consistent format
9 }
10}
11
12class JsonReader implements DataReader
13{
14 public function readData(string $filename): array
15 {
16 // Read and process data from Json file
17 // Return data in a consistent format
18 }
19}
20
21class XmlReader implements DataReader
22{
23 public function readData(string $filename): array
24 {
25 // Read and process data from XML file
26 // Return data in a consistent format
27 }
28}
و در نهایت هم کلاس DataProcessor رو داریم که در واقع همون Static Factory محسوب میشه:
1<?php
2
3class DataProcessor
4{
5 public static function createDataReader(string $type): DataReader
6 {
7 return match ($type) {
8 'csv' => new CsvReader(),
9 'json' => new JsonReader(),
10 'xml' => new XmlReader(),
11 default => throw new InvalidArgumentException('Invalid data type.'),
12 };
13 }
14}
1.1.5. نحوه فراخوانی¶
1 $dataReader = DataProcessor::createDataReader('csv');
2 $data = $dataReader->readData('myData.csv');