1.2. Simple Factory¶
1.2.1. تعریف¶
الگوی Simple Factory یکی از ساده ترین انواع الگوهای Creational یا سازنده محسوب میشه که کارش در نهایت ایجاد شی هست و معمولا بر الگوی Static Factory ترجیح داده میشه.
در این الگو کلاسی رو تعریف می کنیم که مسئولیتش ایجاد شی از کلاس های دیگه با توجه به پارامتر ورودی هست.
تفاوتش با الگوی Static Factory این هست که اینجا برای ایجاد شی از متد استاتیک استفاده نمی کنیم و یک متد غیر static مسئول ایجاد شی هست.
با توجه به ساختاری که برای اون تعریف شده امکان داشتن چندین factory، با پارامترهای مختلف هم وجود داره.
1.2.2. چه زمانی استفاده میشه؟¶
این الگو زمانی استفاده میشه که قصد داریم نحوه ایجاد شی از کلاس رو از دید کلاس های رده بالاتر در برنامه پنهان کنیم.
معمول ترین سناریو هایی که از این الگو استفاده می کنیم:
ایجاد شی پیچیده هست و نیاز به کدهای زیادی برای انجام تنظیمات و… وجود داره
ایجاد شی بستگی به یک متغیر مثل type داره: در شرایط و با توجه به condition های مختلف خروجی متفاوتی رو از factory
انتظار داریم.
ایجاد شی همراه با کش: این الگو کش کردن شی خروجی رو هم ساده تر می کنه
ایجاد شی منوط به پیاده سازی کردن interface مشخص
1.2.3. کاربرد عملی¶
تصویر کنید ما یک فروشگاه طراحی کردیم که محصولات مختلفی در اون به فروش میرسه. مواردی مثل کتاب و لباس و محصولات الکترونیک و…
هر کدوم از این نوع محصولات خصیصه های متفاوتی هم دارن مثل نام و قیمت و توضیحات.
برای ایجاد شی از هر نوع محصول می تونیم از الگوی Simple Factory استفاده کنیم.
1.2.4. پیاده سازی¶
برای پیاده سازی این الگو ابتدا یک interface یا abstract تعریف می کنیم که مشخص کننده ی خصیصه های محصولی هست که قراره تولید بشه:
1<?php
2
3interface Product {
4 public function getName(): string;
5 public function getPrice(): int;
6 public function getDescription(): string;
7}
حالا انواع محصولات رو به این صورت تعریف می کنیم:
1<?php
2
3class Book implements Product {
4 public function __construct(
5 private readonly string $name,
6 private readonly int $price,
7 private readonly string $description
8 ) {
9 }
10
11 public function getName(): string {
12 return $this->name;
13 }
14
15 public function getPrice(): int {
16 return $this->price;
17 }
18
19 public function getDescription(): string {
20 return $this->description;
21 }
22}
23
24class Clothing implements Product {
25 public function __construct(
26 private readonly string $name,
27 private readonly int $price,
28 private readonly string $description
29 ) {
30 }
31
32 public function getName(): string {
33 return $this->name;
34 }
35
36 public function getPrice(): int {
37 return $this->price;
38 }
39
40 public function getDescription(): string {
41 return $this->description;
42 }
43}
44
45class Electronics implements Product {
46 public function __construct(
47 private readonly string $name,
48 private readonly int $price,
49 private readonly string $description
50 ) {
51 }
52
53 public function getName(): string {
54 return $this->name;
55 }
56
57 public function getPrice(): int {
58 return $this->price;
59 }
60
61 public function getDescription(): string {
62 return $this->description;
63 }
64}
و در نهایت هم کلاس ProductFactory رو داریم که در واقع همون Simple Factory محسوب میشه:
1<?php
2
3class ProductFactory
4{
5 /**
6 * @throws Exception
7 */
8 public function createProduct(string $type, string $name, int $price, string $description): Product
9 {
10 if ($type == "book") {
11 return new Book($name, $price, $description);
12 } else if ($type == "clothing") {
13 return new Clothing($name, $price, $description);
14 } else if ($type == "electronics") {
15 return new Electronics($name, $price, $description);
16 } else {
17 throw new Exception("Invalid product type.");
18 }
19 }
20}
1.2.5. نحوه فراخوانی¶
1$productFactory = new ProductFactory();
2$product = $productFactory->createProduct("book", "The Lord of the Rings", 20.99, "A classic fantasy novel.");
3echo $product->getName() . "<br>";
4echo $product->getPrice() . "<br>";
5echo $product->getDescription() . "<br>";