Com recorda la diferència entre el patró de fàbrica abstracta i el mètode de fàbrica en els patrons de disseny?


Resposta 1:

Patró de disseny de fàbrica:

  • Es troba dins del patró de disseny creatiu. El patró de la creació diu que la creació d'objectes serà gestionada per una altra classe mitjançant el tipus d'entrada.

Avantatges:

  • Permet un acoblament solt.

Quan voleu utilitzar el patró de disseny de fàbrica?

  • El patró de disseny de fàbrica s’utilitza quan tenim una superclasse amb diverses subclases i en funció de l’entrada, hem de retornar una de les subclases. Exemple: Si un restaurant serveix menjar vegetal, menjar no vegetal i menjar italià. Trateu VegFood, NonVegFood i ItalianFood com tres classes que la seva superclasse és Food.If un client pregunta "Veg", el mètode Factory tornaria la classe "VegFood".

Exemple:

Pas 1: crear una classe abstracta "Food" que tingui dues variables anomenades "billPerPerson" i "articles".

 classe pública abstracte Menjar

{
    protegida de doble facturaPerPerson;
    articles de conjunt protegits;

    Menjar públic (factura doblePerPersonatge)

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

    public doble doBill ()

    {
        retorna la facturaPerPerson;

    }

    public Set getItems ()
    {
        articles de devolució;
    }
}

Pas 2: crea classes concretes que estenguin la classe abstracta "Menjar"

la classe pública VegFood s’estén els aliments
{
    VegFood públic ()

    {
        super (100);
        articles.add ("Idly");
        articles.add ("Dosa");
        articles.add ("Vada");
    }
}

classe pública NonVegFood estén Food
{
    públic NonVegFood ()
    {
        super (120);
        articles.add ("Biriyani");
        articles.add ("Pollastre 65");
    }
}

Pas 3: creeu un FoodServer que és una classe de fàbrica per crear un objecte per al formigó basat en la informació:

classe pública FoodServer

{
    public static food GetFood (String foodType)

    {
        if (foodType.equals ("veg"))
        {
            retornar el nou VegFood ();
        }
        si no (foodType.equals ("no veg"))
        {
            retorna el nou NonVegFood ();
        }
        més
        {
            System.out.println ("No servim" + foodType);
            retornar nul;
        }
    }
}

Pas 4: Classe principal "Client" per obtenir el menjar requerit en funció del tipus d'aliment.

client públic de classe pública
{
    public static void main (String [] args)
    {
        Food client1Food = FoodServer.getFood ("veg");
        System.out.println ("Client1");
        System.out.println ("Elements:" + client1Food.getItems (). ToString ());
        System.out.println ("Bill:" + client1Food.getBill ());
        Food client2Food = FoodServer.getFood ("no veg");
        System.out.println ("Client1");
        System.out.println ("Elements:" + client2Food.getItems (). ToString ());
        System.out.println ("Bill:" + client2Food.getBill ());
    }
}

Patró de disseny de fàbrica abstracte:

  • Es troba dins del patró de disseny creatiu. Proporciona una interfície per crear famílies d'objectes relacionats o dependents sense especificar els seus models concrets. Els models de fàbrica abstracta és una super fàbrica que retornarà la millor fàbrica basada en input.It actua com a fàbrica de fàbriques. .Realitza el client de saber quina fàbrica seria retornada.

Exemple de la vida real:

  • Penseu en una gran fàbrica que fabrica sabó. Aquesta fàbrica no fabricarà totes les coses necessàries per al sabó. Hi ha moltes subfabriques que fabricarien "saboneta", "embolcall de sabó", etc. Totes es muntarien. per la fàbrica principal.

Quan voleu utilitzar el patró de disseny de fàbrica abstracte?

  • El client hauria de ser independent de com es creen objectes i de quins objectes de classe es crea. Això és útil quan un objecte ha de ser creat a partir d’una família de classes.

NOTA: Pot ser confús, per tant, mireu els vídeos que he incrustat al final d'aquesta pàgina.

Exemple:

Pas 1:

  • Creeu una interfície anomenada "Curs".
Curs d'interfície pública
{
    public String getCourseName ();
}

Pas 2:

  • Creeu classes concretes que implanti la interfície "Curs".
públic curs Curs de programació de programació
{
    @Override
    cadena pública getCourseName ()
    {
       retornar "Java";
    }
}

públic curs Curs d'implantació no programació del curs
{
    @Override
    cadena pública getCourseName ()
    {
        retornar "DSP";
    }
}

Pas 3:

  • Creeu una interfície anomenada "Font".
interfície pública Font
{
    cadena pública getSourceName ();
}

Pas 4:

  • Creeu classes concretes que implanti la interfície "Source".
classe pública implementats fora de línia Font
{
    @Override
    cadena pública getSourceName ()
    {
        tornar "Llibres";
    }
}

public class implementacions en línia Source
{
    @Override
    cadena pública getSourceName ()
    {
        tornar "YouTube";
    }
}

Pas 5:

  • Creeu una classe abstracta "SourceCourseFactory".
classe abstracta pública SourceCourseFactory
{
    abstract públic Font getSource (String sourceType);
    
    public abstract curs Curs getCourse (String courseType);
}

Pas 6:

  • Creeu una classe de fàbrica "CourseFactory" que estengui "SourceCourseFactory"
public class CourseFactory estén SourceCourseFactory
{
    @Override
    font pública getSource (String sourceType)
    {
        retornar nul;
    }

    @Override
    public course getCourse (String courseType)
    {
        if (courseType.equalsIgnoreCase ("programació"))
        {
            retornar un nou ProgramacióCurs ();
        }
        altrament si (courseType.equalsIgnoreCase ("no programa"))
        {
            retornar el nou curs no programat ();
        }
        més
        {
            retornar nul;
        }
    }
}

Pas 7:

  • Creeu una classe de fàbrica "SourceFactory" que estengui "SourceCourseFactory"
la classe pública SourceFactory estén SourceCourseFactory
{

    @Override
    font pública getSource (String sourceType)
    {
        if (sourceType.equalsIgnoreCase ("en línia"))
        {
            tornar nou en línia ();
        }
        else if (sourceType.equalsIgnoreCase ("fora de línia"))
        {
            devolució de nou fora de línia ();
        }
        més
        {
            retornar nul;
        }
    }

    @Override
    public course getCourse (String courseType)
    {
       retornar nul;
    }
    
}

Pas 8:

  • Creeu una classe principal que truqui a la classe de Abstract Factory per obtenir l'objecte real de la classe Factory i, a continuació, el faci servir per realitzar altres operacions.
 classe pública ExempleMain
{
    public static void main (String [] args)
    {
        Curs SourceCourseFactory = FactoryCreator.getSourceCourseFactory ("curs");

        System.out.println (course.getCourse ("programació"). GetCourseName ());

        SourceCourseFactory source = FactoryCreator.getSourceCourseFactory ("font");
        System.out.println (source.getSource ("en línia"). GetSourceName ());

    }
}