Absztrakt gyár programtervezési minta

Az Absztrakt gyár (angolul Abstract factory) programtervezési minta módot nyújt arra, hogy egységbe zárjuk közös témához kapcsolódó egyedi gyártó metódusok egy csoportját anélkül, hogy specifikálnák azok konkrét osztályait.[1] Normál használatban, a kliens szoftver létrehozza az absztrakt gyár egy konkrét implementációját, és aztán a gyár általános interfészét használja a témához kapcsolódó konkrét objektumok létrehozásához. A kliens nem tudja (vagy nem törődik vele), milyen konkrét objektumokat kap ezekből a belső gyárakból, mivel csak a termékeik általános interfészét használja.[1] Ez a tervezési minta szétválasztja egymástól objektumok egy csoportjának implementációját azok általános használatától és objektum összetételre hagyatkozik, mivel az objektumok létrehozása olyan metódusokban van implementálva, amik a gyár interfészén vannak ismertté téve számára.[1] Egy példa az absztrakt gyár mintára, egy DokumentumLétrehozó nevű absztrakt osztály lehetne, ami interfészt nyújt többféle termék létrehozásához (pl.készítsLevelet() és készítsÖsszefoglalót()). A rendszerben bármennyi DokumentumLétrehozó osztályból származtatott konkrét gyár-változat lehet, mint például DíszesDokumentumLétrehozó vagy ModernDokumentumLétrehozó, mindegyikük különböző implementációval a készítsLevelet() és készítsÖsszefoglalót() metódusokra, amik elkészítik majd a megfelelő objektumokat mint például a DíszesLevél vagy a ModernÖsszefoglaló. Ezeknek a termékeknek mindegyike egy-egy egyszerű absztrakt osztályból van származtatva, mint például a Levél vagy az Összefoglaló, amik ismertek a kliens számára. A kliens kódja egy a témának megfelelő példányt fog kapni a DokumentumLétrehozó osztály egy származtatott konkrét osztályából, és annak a gyártó metódusait hívja majd meg. Az eredményül kapott objektumok mindegyike, ezen DokumentumLétrehozó osztály-implementáció által kerül majd legyártásra, amik megfelelnek majd a közös témának (például mindannyian „Díszes” vagy „Modern” objektumok lesznek). A kliensnek csak annyit kell tudnia, hogy hogyan kezelje az absztrakt Levél vagy Összefoglaló osztályokat, nem kell ismernie a specifikus változatokat, amiket a konkrét gyártól kapott.[2]

Egy gyár, egy konkrét osztály helye a kódban, ahol az objektumok létrejönnek. Az absztrakt gyár minta használatának szándéka arra irányul, hogy elszigetelje egymástól az objektumok létrehozását azok használatától, és hogy egymással összefüggő objektumok családjait hozza létre anélkül, hogy azok konkrét osztályaitól függene.[1] Ez lehetővé teszi új származtatott típusok bevezetését, anélkül, hogy az ős osztályokat használó kódot meg kellene változtatni.

Ennek a mintának a használata, lehetővé teszi egy rendszerben a konkrét típus implementációk kicserélését (még akár futásidőben is) anélkül, hogy az őket használó kódot módosítanánk. Mindazonáltal ennek a mintának (és a hasonló programtervezési mintáknak) a használata, szükségtelen komplexitást okozhat, és plusz munkát igényelhet a kezdeti kódkészítésben. Továbbá az absztrakció és a szétválasztás magasabb szintje olyan rendszert eredményezhet, amiben nehezebb a hibakeresés és a karbantartás.

Definíció

Az Absztrakt gyár minta lényege, hogy „Interfészt adjon ahhoz, hogy egymással összefüggő objektumok családjait hozzuk létre anélkül, hogy specifikálnánk a konkrét osztályaikat.”.[3]

Használat

A gyár határozza meg a létrehozásra kerülő objektum tényleges konkrét típusát, és a gyár az a hely ahol az objektum ténylegesen létrejön (például a C++ nyelven, a new művelettel). Mindazonáltal, a gyár csak egy absztrakt mutatót (pointert) ad vissza, ami a létrehozott konkrét objektumra mutat.

Ez elszigeteli a klienst az objektum létrehozástól azáltal, hogy a kliensnek meg kell kérnie egy gyár objektumot, hogy készítse el az általa kívánt absztrakt típust és adjon vissza számára egy absztrakt mutatót az objektumra.[4]

Mivel a gyár csak egy absztrakt mutatót (pointert) ad vissza, a kliens kód (ami az objektumot kérte a gyártól) nem ismeri az éppen létrehozott objektum aktuális, konkrét típusát. Mindazonáltal az absztrakt gyár ismeri a konkrét objektum típusát (ennélfogva a konkrét gyárat is); például az absztrakt gyár beolvashatja ezeket az adatokat egy konfigurációs fájlból. A kliensnek így nem kell típust specifikálnia, mivel az már megadásra került a konfigurációs fájlban. Részleteiben ez a következőt jelenti:

  • A kliens kódnak semmiféle tudomása nincs a konkrét típusról, nem szükséges meghivatkoznia vagy tartalmaznia semmilyen ezzel kapcsolatos header fájlt vagy osztály deklarációt. A kliens kód csak az absztrakt típussal dolgozik. A konkrét típusnak megfelelő objektumok ténylegesen a gyár által kerülnek létrehozásra, de a kliens kód képes használni ezeket az absztrakt interfészükön keresztül (kizárólag ezen keresztül, mivel csak ezt ismeri).[5]
  • Új konkrét típusok hozzáadása (használata) a kliens kód módosításával történik úgy, hogy azok egy másik gyárat használjanak mint eddig, amely módosítás jellemzően egyetlen sort érint, egyetlen fájlban. A másik (módosított) gyár aztán eltérő konkrét típus hoz majd létre, de még mindig ugyanolyan absztrakt típusra irányuló mutatót ad vissza, mint annak előtte — ezáltal elszigeteli a kliens kódját a változástól. Ez jelentősen egyszerűbb, mint módosítani a kliens kódját arra, hogy újfajta típust hozzon létre, ami változtatást kívánna meg minden helyen a kódban, ahol az újfajta objektum létrehozásra kerül (ami mellett biztosítani kellene azt is, hogy az összes ilyen kód-hely tudomással rendelkezzen az újfajta konkrét típusról, például azzal, hogy a forráskódokban mindenhol meghivatkozzuk az újfajta osztály header fájlját). Ha minden gyártó objektum globálisan tárolva van egy Egyke (singleton) objektumban, és az összes kliens kód ezen keresztül éri el a megfelelő gyárat az objektum létrehozáshoz, akkor a gyárak (ezáltal a gyártott konkrét típusok) megváltoztatása ennek az Egyke objektumnak a megváltoztatására egyszerűsödik.[5]

Felépítése

Rational Osztály Diagram

A createButton függvény a GuiFactory interfészben Button típusú objektumokat ad vissza. Az, hogy a Button objektumnak milyen konkrét implementációja kerül visszaadásra, a GuiFactory osztály implementációján múlik, ami a függvényhívást kezeli.

UML Osztály Diagram

Lepus3 Diagram (jelmagyarázat)

Pszeudokód

A kód egy gombot (Button) készít, amely Windows vagy Mac OS X stílusú lehet, attól függően, hogy melyik gyárat használjuk. Vegyük észre, hogy az alkalmazásnak (Application) semmilyen tudomása nincs arról, hogy milyen „GuiFactory” gyár van számára megadva (mi a konkrét implementációja), mint ahogy arról sem, hogy az konkrétan milyen gombot (Button) gyárt.

interface Button is
  method paint()

interface GUIFactory is
  method createButton()
      output:  a button

class WinFactory implementing GUIFactory is
  method createButton() is
      output:  a Windows button
    Return a new WinButton

class OSXFactory implementing GUIFactory is
  method createButton() is
      output:  an OS X button
    Return a new OSXButton

class WinButton implementing Button is
  method paint() is
    Render a button in a Windows style

class OSXButton implementing Button is
  method paint() is
    Render a button in a Mac OS X style

class Application is
  constructor Application(factory) is
      input:  the GUIFactory factory used to create buttons
    Button button := factory.createButton()
    button.paint()

Read the configuration file
If the OS specified in the configuration file is Windows, then
  Construct a WinFactory
  Construct an Application with WinFactory
else
  Construct an OSXFactory
  Construct an Application with OSXFactory

C# példa

Az Absztrakt gyár az alap Gyár minta bővítése. Gyár interfészeket nyújt egymással összetartozó osztályok gyártásához. Más szavakkal, interfészeket deklarálok a Gyárakhoz, amiket aztán hasonló módon használok mint az alap Gyár mintánál.

/*IVSR:Abstract factory pattern*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DesignPatterns.AbstractFactory
{
    public class GenericFactory<T> 
        where T : new()
    {
        public T CreateObject()
        {
            return new T();
        }
    }

    public abstract class CarFactory
    {
        public abstract SportsCar CreateSportsCar();
        public abstract FamilyCar CreateFamilyCar();
    }
    
    public abstract class FamilyCar
    {
        public abstract void Speed(SportsCar abstractSportsCar);
    }

    public abstract class SportsCar
    {
    }

    public class MercedesFactory : CarFactory
    {
        public override SportsCar CreateSportsCar()
        {
            return new MercedesSportsCar();
        }

        public override FamilyCar CreateFamilyCar()
        {
            return new MercedesFamilyCar();
        }
    }

     
    class MercedesSportsCar : SportsCar
    {
    }

    class MercedesFamilyCar : FamilyCar
    {
        public override void Speed(SportsCar abstractSportsCar)
        {
            Console.WriteLine(GetType().Name + " is slower than "
                + abstractSportsCar.GetType().Name);
        }
    }

    public class Driver
    {
        private CarFactory _carFactory;
        private SportsCar _sportsCar;
        private FamilyCar _familyCar;

        public Driver(CarFactory carFactory)
        {
            _carFactory = carFactory;
            _sportsCar = _carFactory.CreateSportsCar();
            _familyCar = _carFactory.CreateFamilyCar();
        }

        public CarFactory CarFactory
        {
            get { return _carFactory; }
            set { _carFactory = value; }
        }

        public SportsCar SportsCar
        {
            get { return _sportsCar; }
        }

        public FamilyCar FamilyCar
        {
            get { return _familyCar; }
        }

        public void CompareSpeed()
        {
            FamilyCar.Speed(SportsCar);
        }
    }
}

A gyártó metódusok szintén egy közös interfész alapján vannak implementálva, melyek mindegyike objektumokat ad vissza.

    //IVSR: Abstract factory using common interface
    public interface IPeopleFactory
    {
        IPeople GetPeople();
    }

    public class VillagersFactory : IPeopleFactory
    {
        public IPeople GetPeople()
        {
            return new Villagers();
        }
    }

    public interface IProductFactory
    {
        IProduct GetProduct();
    }

    public class AppleFactory : IProductFactory
    {
        public IProduct GetProduct()
        {
            return new IPhone();
        }
    }

    public abstract class AbstractFactory
    {
        public abstract IPeopleFactory GetPeopleFactory();
        public abstract IProductFactory GetProductFactory();
    }

    public class ConcreteFactory : AbstractFactory
    {
        public override IPeopleFactory GetPeopleFactory()
        {
            return new VillagersFactory ();
        }

        public override IProductFactory GetProductFactory()
        {
            return new AppleFactory ();
        }
    }

Kapcsolódó szócikkek

Jegyzetek

  1. a b c d (2004) „Head First Design Patterns” (puha kötésű könyv) 1, 156. o, Kiadó: O'REILLY. (Hozzáférés: 2012. szeptember 12.) 
  2. (2004) „Head First Design Patterns” (paperback) 1, 162. o, Kiadó: O'REILLY. (Hozzáférés: 2012. szeptember 12.) 
  3. Gamma, Erich: Design Patterns: Abstract Factory. informIT, 2009. október 23. [2012. május 16-i dátummal az eredetiből archiválva]. (Hozzáférés: 2012. május 16.) „Object Creational: Abstract Factory: Intent: Provide an interface for creating families of related or dependent objects without specifying their concrete classes.”
  4. Veeneman, David: Object Design for the Perplexed. The Code Project, 2009. október 23. [2011. február 21-i dátummal az eredetiből archiválva]. (Hozzáférés: 2012. május 16.) „The factory insulates the client from changes to the product or how it is created, and it can provide this insulation across objects derived from very different abstract interfaces.”
  5. a b Abstract Factory: Implementation. OODesign.com. (Hozzáférés: 2012. május 16.)

Fordítás

Ez a szócikk részben vagy egészben az Abstract factory pattern című angol Wikipédia-szócikk ezen változatának fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel. Ez a jelzés csupán a megfogalmazás eredetét és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.

Read other articles:

Clare Stewart di festival tahun 2016 Festival Film London BFI (Inggris: BFI London Film Festivalcode: en is deprecated ) adalah sebuah festival film tahunan yang diadakan di Britania Raya, yang diadakan pada paruh kedua Oktober dengan kerjasama dari British Film Institute. Festival tersebut menayangkan lebih dari 300 film, dokumenter dan film pendek dari sekitar 50 negara. Referensi Pranala luar bfi Homepage Diarsipkan 2019-07-31 di Wayback Machine. London Film Festival Homepage Diarsipkan 20...

 

Economic scenario This article is about the economic and econometric sense of the word. For other uses, see Competition. Adjacent advertisements in an 1885 newspaper for the makers of two competing ore concentrators (machines that separate out valuable ores from undesired minerals). The lower ad touts that their price is lower, and that their machine's quality and efficiency was demonstrated to be higher, both of which are general means of economic competition. Part of a series onCapitalism C...

 

العلاقات الدنماركية الموريشيوسية الدنمارك موريشيوس   الدنمارك   موريشيوس تعديل مصدري - تعديل   العلاقات الدنماركية الموريشيوسية هي العلاقات الثنائية التي تجمع بين الدنمارك وموريشيوس.[1][2][3][4][5] مقارنة بين البلدين هذه مقارنة عامة ومرجعية �...

Indian actress, producer (born 1984) Nayantara redirects here. For other uses, see Nayantara (disambiguation). NayantharaNayanthara at Filmfare AwardsBornDiana Mariam Kurian (1984-11-18) 18 November 1984 (age 39)Bangalore, Karnataka, IndiaEducationMar Thoma College (BA)OccupationsActressproducerYears active2003–presentWorksFull listSpouse Vignesh Shivan ​(m. 2022)​Children2AwardsFull listSignature Nayanthara (born Diana Mariam Kurian; 18 November 1984)...

 

Questa voce sull'argomento Nazionali di calcio è solo un abbozzo. Contribuisci a migliorarla secondo le convenzioni di Wikipedia. Voce principale: Nazionale di calcio della Norvegia. Norvegia Uniformi di gara Casa Trasferta Sport Calcio Federazione NFFNorges Fotballforbund Codice FIFA NOR Selezionatore Jan Peder Jalland Record presenze - Capocannoniere - Esordio internazionale Danimarca Under-16 6 - 1 Norvegia Under-16 Vanløse, Danimarca; 25 settembre 1971 Migliore vittoria San Ma...

 

Sketsa Portugis untuk Gad. Suku Gad (Ibrani: שבט גד Shevet Gad, Šḗḇeṭ Gāḏ; Inggris: Tribe of Gad) adalah salah satu dari suku-suku Israel menurut Alkitab Ibrani, keturunan dari Gad, anak Yakub. Pembagian tanah suku-suku Israel Wilayah Musa membagi tanah milik suku Ruben, suku Gad dan sebagian suku Manasye di sebelah timur sungai Yordan (Transjordan).[1] Suku Gad menerima daerah kepunyaan mereka yaitu Yaezer dan segala kota negeri Gilead, serta setengah negeri or...

Cornish miner and murderer William WilliamsWilliams in 1905Bornc. 1877St Ives, Cornwall, UKDied13 February 1906(1906-02-13) (aged 28–29)Saint Paul, Minnesota, United StatesCause of deathBotched execution by hanging (unintentional strangulation)OccupationMinerKnown forLast person executed by the state of MinnesotaCriminal statusExecuted (February 13, 1906; 118 years ago (1906-02-13))Conviction(s)Premeditated first-degree murderCriminal penaltyDeath William Wi...

 

1929 film The Return of Sherlock HolmesTheatrical release posterDirected byBasil DeanWritten byArthur Conan DoyleBasil DeanGarrett FortProduced byBasil DeanStarringClive BrookH. Reeves-SmithBetty LawfordCharles HayPhillips HolmesCinematographyWilliam O. SteinerEdited byHelene TurnerProductioncompanyParamount PicturesDistributed byParamount PicturesRelease date October 29, 1929 (1929-10-29) Running time71 minutesCountryUnited StatesLanguageEnglish The Return of Sherlock Holmes i...

 

Championnat du mondedes rallyes 2019 Sébastien Ogier durant son Rallye Monte-Carlo victorieux.Généralités Sport Rallye automobile Création 1973 Organisateur(s) FIA Édition 47e Nombre de manches 14 rallyes Palmarès Champion pilote Ott Tänak Champion copilote Martin Järveoja Champion constructeur Hyundai Navigation 2018 2020 modifier Le championnat du monde des rallyes 2019 est la 47e édition du championnat du monde des rallyes. Il est composé de quatorze manches réparties sur...

Star in the constellation Cassiopeia 2 Cassiopeiae Location of 2 Cassiopeiae (circled) Observation dataEpoch J2000.0      Equinox J2000.0 Constellation Cassiopeia Right ascension 23h 09m 44.1389s[1] Declination +59° 19′ 57.687″[1] Apparent magnitude (V) +5.679[2] Characteristics Spectral type A4II[3] (kA5hA7mF0)[4] U−B color index +0.31[5] B−V color index +0.33[5]...

 

Му́рманск — город в России, основан в 1915 году (статус города — с 4 октября 1916 года) на восточном побережье Кольского залива Баренцева моря. Содержание 1 Российская империя 1.1 Основание 1.2 Февральская революция, переименование города 2 Октябрьская революция, гражданск...

 

Cinema of China List of Chinese films pre-1930 1930s 1940s 1950s 1960s 1970s 1980s 1990s 1990 1991 1992 1993 19941995 1996 1997 1998 1999 2000s 2000 2001 2002 2003 20042005 2006 2007 2008 2009 2010s 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020s 2020 2021 2022 2023 2024 Chinese Animationvte A list of mainland Chinese films released in 1999: Title Director Cast Genre Notes A Beautiful New World Shi Runjiu Jiang Wu Comedy Agreed Not to Separate Fu Jingsheng Fei Ming Pu Cunxin Xu Qing ...

Debate in American schools In American schools, the Genesis creation narrative was generally taught as the origin of the universe and of life until Darwin's scientific theories became widely accepted. While there was some immediate backlash, organized opposition did not get underway until the Fundamentalist–Modernist controversy broke out following World War I; several states passed laws banning the teaching of evolution while others debated them but did not pass them. The Scopes Trial was ...

 

County in Indiana, United States County in IndianaGrant CountyCountyGrant County Courthouse in MarionLocation within the U.S. state of IndianaIndiana's location within the U.S.Coordinates: 40°31′N 85°39′W / 40.52°N 85.65°W / 40.52; -85.65Country United StatesState IndianaFounded1831Named forSamuel and Moses GrantSeatMarionLargest cityMarionArea • Total414.90 sq mi (1,074.6 km2) • Land414.07 sq mi (1,072...

 

Sexual attraction to people of any gender Bisexual redirects here. For bisexual plants, see Monoicy. For other uses, see Bisexual (disambiguation). Bisexual flag first used in 1998 Sexual orientation Sexual orientations Asexual Bisexual Heterosexual Homosexual Related terms Allosexuality Androphilia and gynephilia Bi-curious Gray asexuality Demisexuality Non-heterosexual Pansexuality Plurisexuality Queer Queer heterosexuality Research Biological Birth order Epigenetic Neuroscientific Prenatal...

This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: Byfleet – news · newspapers · books · scholar · JSTOR (January 2023) (Learn how and when to remove this message) Village in EnglandByfleetVillageByfleet Village HallByfleetLocation within SurreyArea6.24 km2 (2.41 sq mi)Population7,724 (ward,...

 

Questa voce sull'argomento santi italiani è solo un abbozzo. Contribuisci a migliorarla secondo le convenzioni di Wikipedia. Beato Alberto da SarteanoFrancescano  Nascita1385 a Sarteano Morte15 agosto 1450 a Milano Venerato daChiesa cattolica Ricorrenza15 agosto Patrono digiuristi Manuale Alberto Berdini (anche noto come Alberto da Sarteano) (Sarteano, 1385 – Milano, 15 agosto 1450) è stato un francescano italiano, venerato come beato dalla Chiesa cattolica. Indice 1 Biografia ...

 

Dutch film director, screenwriter, actor and painter Alex van WarmerdamAlex van Warmerdam in 1996Born (1952-08-14) 14 August 1952 (age 71)Haarlem, NetherlandsOccupation(s)Writer, film director, actorSpouseAnnet MalherbeChildrenMees, Houk Alex van Warmerdam (born 14 August 1952) is a Dutch screenwriter, film director, and actor. He is also a painter. Life and career Van Warmerdam was born in Haarlem, a city in the province of North Holland in the Netherlands. He was cofounder of the ...

American documentary TV series Coach PrimeGenreSports documentaryStarringDeion SandersCountry of originUnited StatesOriginal languageEnglishNo. of seasons2No. of episodes10ProductionExecutive producers Michael Gleaton Constance Schwartz-Morini FredAnthony Smith Michael Strahan Production locationJackson, MSCinematographyGregory KerrickEditorJeff ToberProduction companies SMAC Entertainment Prime Video Sports Original releaseNetworkPrime VideoRelease2022 (2022) Coach Prime is an American ...

 

Pour les articles homonymes, voir Eusèbe. Eusèbe Portrait imaginaire d'Eusèbe, gravure de Giovanni Battista de' Cavalieri, Pontificum Romanorum Effigies, 1580 Biographie Nom de naissance Eusébios Naissance Sardaigne Décès 309 ou 310 Sicile Pape de l'Église catholique Élection au pontificat printemps 308, 309 ou 310 Fin du pontificat 309 ou 310 Marcel Ier Miltiade (en) Notice sur www.catholic-hierarchy.org modifier  Eusèbe, mort en Sicile en 309 ou 310, est un évêque de Rome d...