Kuidas mäletate erinevust abstraktse tehase mustri ja tehase meetodi mustri vahel kujundusmustrites?


Vastus 1:

Tehase kujundusmuster:

  • See kuulub loomingulise kujundusmustri alla. Tehasemustri kohaselt tegeleb objekti loomisega sisenditüübi abil teine ​​klass.

Eelised:

  • See võimaldab lahti ühendamist.

Millal tehase kujundusmustrit kasutada?

  • Tehasekujundusmustrit kasutatakse juhul, kui meil on mitme alamklassiga suveklass ja sisendi põhjal peame tagastama ühe alamklassi. Näide: kui restoran pakub köögivilja-, köögivilja- ja itaalia toite. Käsitlege VegFoodi, NonVegFoodi ja ItalianFoodi kolme klassina, mille superklassiks on toit. Kui klient küsib "Veg", tagastaks tehase meetod klassi "VegFood".

Näide:

1. samm: looge abstraktne klass "Toit", millel on kaks muutujat "billPerPerson" ja "üksused".

 avalik abstraktne klass Toit

{
    kaitstud topelt billPerPerson;
    kaitstud komplekt;

    avalik toit (double billPerPerson)

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

    avalik topelt getBill ()

    {
        tagastama billPerPerson;

    }

    avalik seada getItems ()
    {
        tagastama kaubad;
    }
}

2. samm: looge konkreetsed klassid, mis laiendavad abstraktset klassi "Toit"

avaliku klassi VegFood laiendab toitu
{
    avalik VegFood ()

    {
        super (100);
        items.add ("Idly");
        üksused.add ("Dosa");
        kirjed.add ("Vada");
    }
}

avaliku klassi NonVegFood laiendab toitu
{
    avalik NonVegFood ()
    {
        super (120);
        üksused.add ("Biriyani");
        kirjed.add ("Kana 65");
    }
}

3. samm: looge tehase klassi kuuluv FoodServer, et luua järgmise teabe põhjal betooni objekt:

avalik klass FoodServer

{
    avalik staatiline toit getFood (string foodType)

    {
        if (foodType.equals ("veg"))
        {
            tagastage uus VegFood ();
        }
        else if (foodType.equals ("mitte veg"))
        {
            tagastage uus NonVegFood ();
        }
        muud
        {
            System.out.println ("Me ei teeninda" + foodType);
            tagasi null;
        }
    }
}

4. samm: põhiklass "Klient", et saada vajalik toit vastavalt toidutüübile.

avaliku klassi klient
{
    avalik staatiline tühine pea (string [] args)
    {
        Toidu klient1Food = FoodServer.getFood ("veg");
        System.out.println ("Klient1");
        System.out.println ("Üksused:" + klient1Food.getItems (). ToString ());
        System.out.println ("Arve:" + klient1Food.getBill ());
        Toidu klient2Food = FoodServer.getFood ("mitte veg");
        System.out.println ("Klient1");
        System.out.println ("Üksused:" + klient2Food.getItems (). ToString ());
        System.out.println ("Arve:" + klient2Food.getBill ());
    }
}

Tehase abstraktne muster:

  • See kuulub loomingulise kujundusmustri alla. See pakub liidest seotud või sõltuvate objektide perekondade loomiseks ilma nende konkreetseid klasse täpsustamata. .See abstraktselt abistab klienti teadmast, milline tehas tagastatakse.

Reaalse elu näide:

  • Mõelge suurele tehasele, kes toodab seepi.See tehas ei valmista kõiki seebi jaoks vajalikke asju.Sel oleks palju alamvabrikuid, mis valmistaksid "seebiriba", "seebimähise" jms. Kõik oleks kokku pandud peatehase poolt.

Millal kasutada abstraktse tehase kujundusmustrit?

  • Klient peaks olema sõltumatu sellest, kuidas objektid luuakse ja mille jaoks klassi objekt luuakse. See on abiks juhul, kui objekt tuleb luua klasside perekonnast.

MÄRKUS. See võib olla segane, nii et palun vaadake videoid, mille olen selle lehe lõppu manustanud.

Näide:

Samm 1:

  • Looge liides nimega "Kursus".
avaliku liidese kursus
{
    avalik keel String getCourseName ();
}

2. samm:

  • Looge betoonklassid, mis rakendavad "Kursuse" liidest.
avaliku klassi programmeerimineKursus viib ellu kursuse
{
    @Ülesõit
    avalik stringi getCourseName ()
    {
       tagastage "Java";
    }
}

avalik klass NonProgrammingCourse rakendab kursust
{
    @Ülesõit
    avalik stringi getCourseName ()
    {
        tagasi "DSP";
    }
}

3. samm:

  • Looge liides nimega "Allikas".
avalik liides Allikas
{
    avalik string getSourceName ();
}

4. samm:

  • Looge betoonklassid, mis rakendavad liidese "Allikas".
avalik klass offline rakendab Allikas
{
    @Ülesõit
    avalik string string getSourceName ()
    {
        tagastage "Raamatud";
    }
}

avalik klass Online rakendab Allikas
{
    @Ülesõit
    avalik string string getSourceName ()
    {
        naasta "YouTube";
    }
}

5. samm:

  • Looge abstraktne klass "SourceCourseFactory".
avalik abstraktne klass SourceCourseFactory
{
    avalik abstraktne allikas getSource (String sourceType);
    
    avalik abstraktne kursus getCourse (String courseType);
}

6. samm:

  • Looge tehaseklass "CourseFactory", mis laiendab "SourceCourseFactory"
Avalik klass CourseFactory laiendab SourceCourseFactory
{
    @Ülesõit
    avalik allikas getSource (stringi lähtetüüp)
    {
        tagasi null;
    }

    @Ülesõit
    avalik kursus getCourse (keelpillitüüp)
    {
        if (courseType.equalsIgnoreCase ("programmeerimine"))
        {
            tagastage uus programmeerimiskursus ();
        }
        muidu kui (courseType.equalsIgnoreCase ("mitte programmeerimine"))
        {
            tagastage uus NonProgrammingCourse ();
        }
        muud
        {
            tagasi null;
        }
    }
}

7. samm:

  • Looge tehaseklass "SourceFactory", mis laiendab "SourceCourseFactory"
Avalik klass SourceFactory laiendab SourceCourseFactory
{

    @Ülesõit
    avalik allikas getSource (stringi lähtetüüp)
    {
        if (sourceType.equalsIgnoreCase ("online"))
        {
            naase uus võrgus ();
        }
        else if (sourceType.equalsIgnoreCase ("offline"))
        {
            naase uus ühenduseta ();
        }
        muud
        {
            tagasi null;
        }
    }

    @Ülesõit
    avalik kursus getCourse (keelpillitüüp)
    {
       tagasi null;
    }
    
}

8. samm:

  • Looge põhiklass, mis kutsub kokku abitehase klassi, et saada tõeline tehase klassi objekt ja seejärel kasutab ta seda objekti muude muude toimingute tegemiseks.
 avaliku klassi näideMain
{
    avalik staatiline tühine pea (string [] args)
    {
        SourceCourseFactory kursus = FactoryCreator.getSourceCourseFactory ("kursus");

        System.out.println (kursus.getKursus ("programmeerimine"). GetCourseName ());

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

    }
}