یک مشکل در  Abstract Factory

پرسیده شده
فعالیت 1280 روز پیش
دیده شده 825 بار
0

سلام

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

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

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

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

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

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

فایل پیوست

0
حذف شده

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

فایل پیوست

کیوان علی محمدی

توسط

کیوان علی محمدی

4 آبان 99

حذف شده
شما فرض کنید ما یک موجودیت جدید داریم که به  Shape  , Color مرتبط هست در اینصورت ما سه متد در AbstractFactory داریم که این  باعث میشه دو متد در سه factory ما کاری انجام ندن
حذف شده
خب همین فرض اشتباهه. ما اصلا برای color نمی تونیم factory در نظر بگیریم. اگر قراره color به عنوان یک abstraction در نظر گرفته بشه باید از یه چیزی مثل bridge pattern استفاده کنید.
حذف شده
پس این مثال و این کد آپلود شده کاملا اشتباهه
0
حذف شده

سلام

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

این کد به این شکل هستش که ما تعدادی محصول دیجیتال داریم موبایل , لب تاپ و تب لت که سه کارخانه 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();

 

فایل پیوست

محسن محمدخانی

توسط

محسن محمدخانی

11 آبان 99

حذف شده
این مثال بهتری هست برای Abstract Factory.
0
حذف شده

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

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

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

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

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

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

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

فایل پیوست

محسن محمدخانی

توسط

محسن محمدخانی

11 آبان 99

0
حذف شده

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

فایل پیوست

کیوان علی محمدی

توسط

کیوان علی محمدی

12 آبان 99

جلسه استفاده از Factory Design Pattern و Interface Segregation