💻 آخرین فرصت یادگیری برنامه‌نویسی با آفر ویژه قبل از افزایش قیمت در ۵ آذر ماه (🎁 به همراه یک هدیه ارزشمند )
۰ ثانیه
۰ دقیقه
۰ ساعت
۴ محسن محمدخانی
یک مشکل در  Abstract Factory
جامعه جاوا اسکریپت ایجاد شده در ۰۴ آبان ۱۳۹۹

سلام

من یک مثالی از دیزاین پترن Abstract Factory با زبان php آپلود کردم

دیزاین پترن Abstract Factory یه جورایی کارخانه ی کارخانه هاست 

در این مثال ما در هر  factory مثل shapeFactory , colorFactory متدهای کلاس AbstractFactory باید تعریف کنیم

در colorFactory  ما متد  getShape داریم که داخلش کاری انجام نمیدیم و برعکسش در shapeFactory  متد getColor داریم

اگر ما بعدا یک mobileFactory اضافه  کنیم که پیاده سازی‌های اون Apple , Sumsong ,  Sony باشه باید یک متد به نام getMobile داشته باشیم  که این باعث میشه که در colorFactory  دو متد داشته باشیم که کاری انجام نمیدن ولی باید تعریفشون کنیم.آیا این مشکل هست؟

اگر هست چطوری باید حلش کرد؟

سلام.ما زمانی از abstract factory استفاده می‌کنیم که بخوایم محصولات مرتبطی داشته باشیم و هر محصول خودش پیاده سازی‌های مختلفی داشته باشه.مشکل مثال شما هم اینه که میخواید چیزی به اسم shape و color و mobile رو به عنوان موجودیت‌های مرتبط معرفی کنید که به نظر بنده مشکل داره.

کیوان علی محمدی ۰۴ آبان ۱۳۹۹، ۱۸:۳۹

سلام

آیا این کد مثال درستی از دیزاین پترن هستش؟

این کد به این شکل هستش که ما تعدادی محصول دیجیتال داریم موبایل , لب تاپ و تب لت که سه کارخانه asus , apple , Lenovo  هستش

ما در اینجا کارخانه ای از کارخانه‌ها (Factory Of Factory) داریم.

 

<?php
interface  DeviceDigital
{
    public function getInfoCpu();
    public function getInfoRam();
}
/**
 * this is a type of Asus laptop
 */
class AsusK55VD implements DeviceDigital
{
    public function getInfoCpu()
    {
        echo AsusK55VD::class . " info cpu core i5 2.5Ghz 3M Cache";
    }
    public function getInfoRam()
    {
        echo AsusK55VD::class . " info Ram 6GByte";
    }
}
/**
 * this is a type of Asus mobile
 */
class AsusZenfoMaxPlus implements DeviceDigital
{
    public function getInfoCpu()
    {
        echo AsusZenfoMaxPlus::class . " info cpu core 3i  ";
    }
    public function getInfoRam()
    {
        echo AsusZenfoMaxPlus::class . " info Ram 2GByte";
    }
}
/**
 * this is a type of Asus Tablet
 */
class  AsusZ170CG implements DeviceDigital
{
    public function getInfoCpu()
    {
        echo AsusZ170CG::class . " info cpu  Quad-core 1.3 GHz  ";
    }
    public function getInfoRam()
    {
        echo AsusZ170CG::class . " info Ram 8GByte";
    }
}
/**
 * this is a type of Apple laptop
 */
class MacProMWIJ2 implements DeviceDigital
{
    public function getInfoCpu()
    {
        echo MacProMWIJ2::class . " info cpu core i7";
    }
    public function getInfoRam()
    {
        echo MacProMWIJ2::class . " info Ram 6GByte";
    }
}
/**
 * this is a type of Apple mobile
 */
class Iphone5 implements DeviceDigital
{
    public function getInfoCpu()
    {
        echo Iphone5::class . " info cpu core 5i  ";
    }
    public function getInfoRam()
    {
        echo Iphone5::class . " info Ram 1GByte";
    }
}
/**
 * this is a type of Apple Tablet
 */
class  IPadProAir implements DeviceDigital
{
    public function getInfoCpu()
    {
        echo IPadProAir::class . " info cpu  Quad-core 2.5 GHz  ";
    }
    public function getInfoRam()
    {
        echo IPadProAir::class . " info Ram 4GByte";
    }
}
/**
 * this is a type of lenovo laptop
 */
class LenovoIdeaPad3 implements DeviceDigital
{
    public function getInfoCpu()
    {
        echo LenovoIdeaPad3::class . " info cpu core i3";
    }
    public function getInfoRam()
    {
        echo LenovoIdeaPad3::class . " info Ram 12GByte";
    }
}
/**
 * this is a type of lenovo mobile
 */
class LenovoVibe7 implements DeviceDigital
{
    public function getInfoCpu()
    {
        echo LenovoVibe7::class . " info cpu core 3i  ";
    }
    public function getInfoRam()
    {
        echo LenovoVibe7::class . " info Ram 2GByte";
    }
}
/**
 * this is a type of lenovo Tablet
 */
class  LenovoTabM7 implements DeviceDigital
{
    public function getInfoCpu()
    {
        echo LenovoTabM7::class . " info cpu  Quad-core 1.5 GHz  ";
    }
    public function getInfoRam()
    {
        echo LenovoTabM7::class . " info Ram 2GByte";
    }
}
abstract class AbstractDeviceDigitalFactory
{
    abstract public function createMobileDeviceDigital();
    abstract public function createLaptopDeviceDigital();
    abstract public function createTabletDeviceDigital();
}
class AsusFactory extends AbstractDeviceDigitalFactory
{
    public function createMobileDeviceDigital()
    {
        return new AsusZenfoMaxPlus();
    }
    public function createLaptopDeviceDigital()
    {
        return new AsusK55VD();
    }
    public function createTabletDeviceDigital()
    {
        return new AsusZ170CG();
    }
}
class AppleFactory extends AbstractDeviceDigitalFactory
{
    public function createMobileDeviceDigital()
    {
        return new Iphone5();
    }
    public function createLaptopDeviceDigital()
    {
        return new MacProMWIJ2();
    }
    public function createTabletDeviceDigital()
    {
        return new IPadProAir();
    }
}
class LenovoFactory extends AbstractDeviceDigitalFactory
{
    public function createMobileDeviceDigital()
    {
        return new LenovoVibe7();
    }
    public function createLaptopDeviceDigital()
    {
        return new LenovoIdeaPad3();
    }
    public function createTabletDeviceDigital()
    {
        return new  LenovoTabM7();
    }
}
function echoTag($tag)
{
    echo "<" . $tag . ">";
}
$asusFactory = new AsusFactory();
$appleFactory = new AppleFactory();
$asusLaptop = $asusFactory->createLaptopDeviceDigital();
$asusLaptop->getInfoCpu();
echoTag('br');
$asusLaptop->getInfoRam();
echoTag('hr');
$asusMobile = $asusFactory->createMobileDeviceDigital();
$asusMobile->getInfoCpu();
echoTag('br');
$asusMobile->getInfoRam();
echoTag('hr');
$appleLaptop = $appleFactory->createLaptopDeviceDigital();
$appleLaptop->getInfoCpu();
echoTag('br');
$appleLaptop->getInfoRam();

 

محسن محمدخانی ۱۱ آبان ۱۳۹۹، ۱۸:۳۹

برای من اینجا سوالی پیش اومده که فرض کنید یک factory اضافه میشه که نمی‌تونه یکی از محصول‌ها رو بسازه ولی یه محصولی میسازه که بقیه  factory‌ها نمی‌تونن بسازن

مثلا من الان sumsong به عنوان factory اضافه میکنم

 sumsong در برنامه ما نمیتونه laptop بسازه اما smart watch می‌تونه بسازه  

 دو asus , apple factory  هم میتونن  smart watch بسازن اما lenovo نمیتونه بسازه

در اینجا متد  createLaptopDeviceDigital  برای sumsong factory خالی هستش

و همینطور متد createSmartWatchDeviceDigital برای lenovo  factory خالی هستش

آیا خالی بودن این دو متد مشکلی هستش؟

محسن محمدخانی ۱۱ آبان ۱۳۹۹، ۲۰:۱۷

همون طور که قبلا بهتون گفتم ایده اصلی Abstract Factory به این برمیگرده که اون محصولات رو همه بتونن تولید کنن. حالا اگر مثلا یه شرکتی می‌تونه یه چیزی تولید کنه که بقیه نمی‌تونن بهتره بره داخل مثلا یه Factory مجزای دیگه. اینجا حس می‌کنم ذهنتون روی خود Factory کمی Bias شده و همش فکر می‌کنید اگر یکی نتونه چیزی تولید کنه که بقیه می‌تونن چی میشه؟ اصلا بهتره اینطوری بهش نگاه نکنید. تا جای ممکن محصولات باید توسط همه کارخونه‌ها تولید بشن و اگر مشکلی در تونستن یا نتونستن یک کارخونه وجود داره بهتره به جای دیگه ای منتقل بشه. مثلا می‌تونه خودش یه Factory مجزا بر اساس Factory Method داشته باشه.

کیوان علی محمدی ۱۲ آبان ۱۳۹۹، ۰۸:۲۳