Kuinka muistat eron abstraktin tehdaskuvion ja tehdasmenetelmäkuvion välillä suunnittelukuvioissa?


Vastaus 1:

Tehdassuunnittelumalli:

  • Se kuuluu luovan suunnittelumallin alaan. Tehdaskuvion mukaan objektien luomista käsittelee toinen luokka syötetyyppiä käyttämällä.

edut:

  • Se sallii irrallisen kytkennän.

Milloin käytetään tehdassuunnittelumallia?

  • Tehdassuunnittelumallia käytetään, kun meillä on yläluokka, jolla on useita alaluokkia, ja syötteen perusteella meidän on palautettava yksi alaluokasta. Esimerkki: Jos ravintolassa tarjoillaan vihanneksia, ei-vihanneksia ja italialaisia ​​ruokia. Käsittele VegFoodia, NonVegFoodia ja ItalianFoodia kolmena luokana, joiden yläluokka on Ruoka. Jos asiakas kysyy "Veg", tehdasmenetelmä palauttaa "VegFood" -luokan.

Esimerkki:

Vaihe 1: Luo abstrakti luokka "Ruoka", jossa on kaksi muuttujaa, nimeltään "billPerPerson" ja "esineet".

 julkinen abstrakti luokka Ruoka

{
    suojattu doublePerPerson;
    suojattu Set tuotteet;

    julkinen ruoka (double billPerPerson)

    {
        this.billPerPerson = billPerPerson;
        this.items = uusi HashSet <> ();
    }

    julkinen kaksinkertainen getBill ()

    {
        palauta billPerPerson;

    }

    julkiset aseta getItems ()
    {
        palauta esineet;
    }
}

Vaihe 2: Luo konkreettisia luokkia, jotka laajentavat abstraktia luokkaa "Ruoka"

julkinen luokka VegFood laajentaa ruokaa
{
    julkinen VegFood ()

    {
        Super (100);
        items.add ( "joutilaana");
        items.add ( "Dosa");
        items.add ( "Vada");
    }
}

julkinen luokka NonVegFood laajentaa ruokaa
{
    julkinen NonVegFood ()
    {
        Super (120);
        items.add ( "biriyani");
        items.add ("kana 65");
    }
}

Vaihe 3: Luo FoodServer, joka on tehdasluokka, objektin luomiseksi betonille seuraavien tietojen perusteella:

julkisen luokan FoodServer

{
    julkinen staattinen ruoka getFood (merkkijono foodType)

    {
        if (foodType.equals ("vihannekset"))
        {
            palauta uusi VegFood ();
        }
        else if (foodType.equals ("ei vega"))
        {
            palauta uusi NonVegFood ();
        }
        muu
        {
            System.out.println ("Emme tarjoa" + foodType);
            palauta nolla;
        }
    }
}

Vaihe 4: Pääluokka "asiakas" saadaksesi vaaditun ruoan ruokatyypin perusteella.

julkisen luokan asiakas
{
    julkinen staattinen void main (merkkijono [] args)
    {
        Ruoka asiakas1Food = FoodServer.getFood ("vihannes");
        System.out.println ( "Customer1");
        System.out.println ("Tuotteet:" + asiakas1Food.getItems (). ToString ());
        System.out.println ("Lasku:" + asiakas1Food.getBill ());
        Ruoka customer2Food = FoodServer.getFood ("ei vihannes");
        System.out.println ( "Customer1");
        System.out.println ("Tuotteet:" + asiakas2Food.getItems (). ToString ());
        System.out.println ("Lasku:" + asiakas2Food.getBill ());
    }
}

Abstrakti tehdassuunnittelumalli:

  • Se kuuluu Creational Design Pattern -alueeseen. Se tarjoaa käyttöliittymän läheisten tai riippuvaisten esineiden perheiden luomiseen määrittelemättä niiden konkreettisia luokkia. .Seuraa asiakkaan tietävän, mikä tehdas palautetaan.

Tosielämän esimerkki:

  • Harkitse suurta tehdasta, joka valmistaa saippuaa. Tämä tehdas ei valmista kaikkia saippualle tarvittavia asioita. Siinä olisi monia alatehtaita, jotka valmistaisivat "saippuapalaa", "saippuapakkausta" ja jne .Kaikki kootaan. päätehtaalla.

Milloin abstraktia tehdassuunnittelukuvioita käytetään?

  • Asiakkaan tulee olla riippumaton siitä, miten objektit luodaan ja mille luokkaobjektille luodaan. Tästä on apua, kun objekti on luotava luokkaperheestä.

HUOMAUTUS: Se voi olla hämmentävä, joten katsokaa videoita, jotka olen upottanut tämän sivun loppuun.

Esimerkki:

Vaihe 1:

  • Luo rajapinta nimeltä "Kurssi".
julkisen käyttöliittymän kurssi
{
    julkinen merkkijono getCourseName ();
}

Vaihe 2:

  • Luo konkreettiset luokat, jotka toteuttavat "Kurssi" -rajapinnan.
julkisen luokan ohjelmointiKurssi toteuttaa kurssin
{
    @Ohittaa
    julkinen merkkijono getCourseName ()
    {
       palauta "Java";
    }
}

public class NonProgrammingCourse toteuttaa kurssin
{
    @Ohittaa
    julkinen merkkijono getCourseName ()
    {
        paluu "DSP";
    }
}

Vaihe 3:

  • Luo käyttöliittymä nimeltä "Source".
julkinen käyttöliittymä Lähde
{
    julkinen merkkijono getSourceName ();
}

Step4:

  • Luo konkreettiset luokat, jotka toteuttavat "Lähde" ​​-rajapinnan.
public class Offline toteuttaa Lähde
{
    @Ohittaa
    julkinen merkkijono getSourceName ()
    {
        palauta "Kirjat";
    }
}

public class Online toteuttaa Lähde
{
    @Ohittaa
    julkinen merkkijono getSourceName ()
    {
        palauta "YouTube";
    }
}

Vaihe 5:

  • Luo abstrakti luokka "SourceCourseFactory".
julkinen abstrakti luokka SourceCourseFactory
{
    julkinen abstrakti lähde getSource (merkkijono sourceType);
    
    julkinen abstrakti kurssi getCourse (String courseType);
}

Vaihe 6:

  • Luo tehdasluokka "CourseFactory", joka laajentaa "SourceCourseFactory"
julkinen luokka CourseFactory laajentaa SourceCourseFactorya
{
    @Ohittaa
    julkinen lähde getSource (merkkijono sourceType)
    {
        palauta nolla;
    }

    @Ohittaa
    julkinen kurssi getCourse (jousikurssi tyyppi)
    {
        jos (courseType.equalsIgnoreCase ( "ohjelmointi"))
        {
            palauta uusi ohjelmointikurssi ();
        }
        muuten jos (courseType.equalsIgnoreCase ("ei ohjelmointi"))
        {
            palauta uusi NonProgrammingCourse ();
        }
        muu
        {
            palauta nolla;
        }
    }
}

Vaihe 7:

  • Luo tehdasluokka "SourceFactory", joka laajentaa "SourceCourseFactory"
julkinen luokka SourceFactory laajentaa SourceCourseFactorya
{

    @Ohittaa
    julkinen lähde getSource (merkkijono sourceType)
    {
        jos (sourceType.equalsIgnoreCase ( "online"))
        {
            palaa uusi online ();
        }
        else if (sourceType.equalsIgnoreCase ("offline"))
        {
            palaa uusi offline-tilassa ();
        }
        muu
        {
            palauta nolla;
        }
    }

    @Ohittaa
    julkinen kurssi getCourse (jousikurssi tyyppi)
    {
       palauta nolla;
    }
    
}

Vaihe 8:

  • Luo pääluokka, joka kutsuu Abstract Factory -luokkaa, jotta saadaan todellinen Factory Class -objekti, ja sitten se käyttää tätä objektia suorittamaan muita muita toimintoja.
 julkisen luokan esimerkki
{
    julkinen staattinen void main (merkkijono [] args)
    {
        SourceCourseFactory-kurssi = FactoryCreator.getSourceCourseFactory ("kurssi");

        System.out.println (course.getCourse ( "ohjelmointi"). GetCourseName ());

        SourceCourseFactory source = FactoryCreator.getSourceCourseFactory ("lähde");
        System.out.println (source.getSource ( "online"). GetSourceName ());

    }
}