Absztrakt gyár (tervminta)

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2018. március 2-án felülvizsgált verziótól ; az ellenőrzések 25 szerkesztést igényelnek .
Absztrakt gyár
absztrakt gyár
Típusú generáló
Célja Interfészt biztosít a kapcsolódó vagy egymástól függő objektumok családjainak létrehozásához anélkül, hogy megadná konkrét osztályaikat.
Szerkezet
esetekben érvényes
  • Amikor a programnak függetlennek kell lennie a folyamattól és a létrehozott új objektumok típusától.
  • Amikor egymáshoz kapcsolódó objektumok családjait vagy csoportjait kell létrehozni, kizárva az ezekből a különböző halmazokból származó objektumok egyidejű használatának lehetőségét ugyanabban a kontextusban [1] .
profik
  • elkülöníti az egyes osztályokat;
  • leegyszerűsíti a termékcsaládok cseréjét;
  • garantálja a termék kompatibilitását.
Mínuszok
  • nehéz új típusú termékhez támogatást adni.
Leírása: Tervezési minták Igen

Az  absztrakt gyár egy generatív tervezési minta , amely interfészt biztosít egymáshoz kapcsolódó vagy egymástól függő objektumok családjainak létrehozásához anélkül, hogy megadná konkrét osztályaikat. A mintát egy Factory absztrakt osztály létrehozásával valósítjuk meg, amely egy felület a rendszerkomponensek létrehozásához (például ablakfelülethez ablakokat és gombokat hozhat létre). Ezután olyan osztályokat írnak , amelyek megvalósítják ezt az interfészt [2] .

Időpont

Interfészt biztosít a kapcsolódó vagy egymástól függő objektumok családjainak létrehozásához anélkül, hogy megadná konkrét osztályaikat.

Megvalósítás

Előnyök

Hátrányok

Alkalmazás

Példák

Swift példa

Swift forráskód //: Játszótér - főnév: olyan hely, ahol az emberek játszhatnak /// <summary> /// Abstract factory class /// </summary> protokoll AbstractFactory { func createProductA () -> AbstractProductA func createProductB () -> AbstractProductB } /// <summary> /// Gyári osztály #1 /// </summary> class ConcreteFactory1 : AbstractFactory { public func createProductA () -> AbstractProductA { return ProductA1 () } public func createProductB () -> AbstractProductB { return ProductB1 () } } /// <summary> /// Gyári osztály #2 /// </summary> class ConcreteFactory2 : AbstractFactory { public func createProductA () -> AbstractProductA { return ProductA2 () } public func createProductB () -> AbstractProductB { return ProductB2 () } } /// <summary> /// Absztrakt termékosztály A /// </summary> protokoll AbstractProductA {} // /// <summary> /// B absztrakt termékosztály /// </summary> protokoll AbstractProductB { func interact ( a : AbstractProductA ) } /// <summary> /// A típusú első termékosztály /// </summary> ProductA1 osztály : AbstractProductA {} /// <summary> /// B típusú első termékosztály /// </summary> class ProductB1 : AbstractProductB { public func interact ( a : AbstractProductA ) { print ( " \( type ( of : self )) interacts with \ ( típus ( of : a . self )) " ) } } /// <summary> /// A típusú második termékosztály /// </summary> ProductA2 osztály : AbstractProductA {} /// <summary> /// B típusú második termékosztály /// </summary> class ProductB2 : AbstractProductB { public func interact ( a : AbstractProductA ) { print ( " \( type ( of : self )) interacts with \ ( típus ( of : a . self )) " ) } } /// <summary> /// A kliens osztály, amelyben az objektumok közötti interakció megtörténik /// </summary> class Client { private let _abstractProductA : AbstractProductA private let _abstractProductB : AbstractProductB // Constructor public init ( gyári : AbstractFactory ) { _abstractProductB = factory . CreateProductB (); _abstractProductA = gyári . CreateProductA (); } public func run () { _abstractProductB . interact ( a : _abstractProductA ) } } /// <summary> /// Alkalmazás belépési pontja /// </summary> // Absztrakt gyár hívása #1 let factory1 = ConcreteFactory1 () let client1 = Ügyfél ( gyári : gyár1 ) client1 . futni () // A 2. absztrakt gyár hívása let factory2 = ConcreteFactory2 () let client2 = Client ( gyári : factory2 ) client2 . futni ()

Példa a C#-ban [3]

Forráskód a C Sharpban a rendszer használatával ; névtér DoFactory.GangOfFour.Abstract.Structural { class MainApp { /// <summary> /// Alkalmazás belépési pont /// </summary> public static void Main () { // Absztrakt gyári hívás #1 AbstractFactory factory1 = new ConcreteFactory1 (); Kliens kliens1 = új kliens ( gyári1 ); kliens1 . futni (); // Abstract factory #2 hívása AbstractFactory factory2 = new ConcreteFactory2 (); Kliens kliens2 = új kliens ( gyári2 ); kliens2 . futni (); // Bemenetre vár Konzol . ReadKey (); } } /// <summary> /// Abstract factory class /// </summary> abstract class AbstractFactory { public abstract AbstractProductA CreateProductA (); public abstract AbstractProductB CreateProductB (); } /// <summary> /// Gyári osztály #1 /// </summary> class ConcreteFactory1 : AbstractFactory { public override AbstractProductA CreateProductA () { return new ProductA1 (); } public override AbstractProductB CreateProductB () { return new ProductB1 (); } } /// <summary> /// Gyári osztály #2 /// </summary> class ConcreteFactory2 : AbstractFactory { public override AbstractProductA CreateProductA () { return new ProductA2 (); } public override AbstractProductB CreateProductB () { return new ProductB2 (); } } /// <summary> /// Absztrakt termékosztály A /// </summary> absztrakt osztály AbstractProductA { } /// <summary> /// B absztrakt termékosztály /// </summary> abstract class AbstractProductB { public abstract void Interact ( AbstractProductA a ); } /// <summary> /// Az A típusú első termékosztály /// </summary> Class ProductA1 : AbstractProductA { } /// <summary> /// B típusú első termékosztály /// </summary> class ProductB1 : AbstractProductB { public override void Interact ( AbstractProductA a ) { Console . WriteLine ( ez . GetType (). Name + " interacts with " + a . GetType (). Név ); } } /// <summary> /// A típusú második termékosztály /// </summary> Class ProductA2 : AbstractProductA { } /// <summary> /// B típusú második termékosztály /// </summary> class ProductB2 : AbstractProductB { public override void Interact ( AbstractProductA a ) { Console . WriteLine ( ez . GetType (). Name + " interacts with " + a . GetType (). Név ); } } /// <summary> /// A kliens osztály, amelyben az objektumok közötti interakció megtörténik /// </summary> class Client { private AbstractProductA _abstractProductA ; private AbstractProductB _abstractProductB ; // Constructor public Client ( AbstractFactory factory ) { _abstractProductB = factory . CreateProductB (); _abstractProductA = gyári . CreateProductA (); } public void Futtatás () { _abstractProductB . Interact ( _abstractProductA ); } } }

Java példa

Java forrás public class AbstractFactoryExample { public static void main ( String [ ] args ) { AbstractFactory factory1 = new ConcreteFactory1 (); Kliens kliens1 = új kliens ( gyári1 ); kliens1 . végrehajtani (); AbstractFactory factory2 = new ConcreteFactory2 (); Kliens kliens2 = új kliens ( gyári2 ); kliens2 . végrehajtani (); } } class Client { private AbstractProductA productA ; privát AbsztraktTermékB termékB ; Kliens ( AbstractFactory factory ) { productA = gyár . CreateProductA (); termékB = gyár . CreateProductB (); } void execute () { productB . interakció ( termékA ); } } interface AbstractFactory { AbstractProductA createProductA (); AbstractProductB createProductB (); } interface AbstractProductA { void interact ( AbstractProductB b ); } interface AbstractProductB { void interact ( AbstractProductA a ); } class ConcreteFactory1 megvalósítja az AbstractFactory { @Override public AbstractProductA createProductA () { return new ProductA1 (); } @A publikus felülbírálása AbstractProductB createProductB () { return new ProductB1 (); } } class ConcreteFactory2 valósítja meg az AbstractFactory { @Override public AbstractProductA createProductA () { return new ProductA2 (); } @A public AbstractProductB createProductB () { return new ProductB2 (); } } osztály ProductA1 implementálja az AbstractProductA { @A public void interact ( AbstractProductB b ) { System . ki . println ( ez . getClass (). getName () + " kölcsönhatásba lép a következővel: " + b . getClass (). getName ()); } } Class ProductB1 implementálja az AbstractProductB { @A public void interact felülbírálása ( AbstractProductA a ) { Rendszer . ki . println ( ez . getClass (). getName () + " interacts with " + a . getClass (). getName ()); } } osztály ProductA2 implementálja az AbstractProductA { @Override public void interact ( AbstractProductB b ) { System . ki . println ( ez . getClass (). getName () + " kölcsönhatásba lép a következővel: " + b . getClass (). getName ()); } } Class ProductB2 implementálja az AbstractProductB { @A public void interact felülbírálása ( AbstractProductA a ) { Rendszer . ki . println ( ez . getClass (). getName () + " interacts with " + a . getClass (). getName ()); } }

PHP5 példa

PHP5 forráskód interface IHead { public function drawHead ( $x , $y ); } class RedHead implements IHead { public function drawHead ( $x , $y ) { echo 'A vörös fejed az x tengelyen =' . $x . ' és y tengely =' . $y . '</br>' . PHP_EOL ; } } class WhiteHead implementálja az IHead { public function drawHead ( $x , $y ) { echo 'A fehér fejed az x tengelyen = ' . $x . ' és y tengely =' . $y . '</br>' . PHP_EOL ; } } interface IBody { public function drawBody ( $x , $y ); } class RedBody implementálja az IBody-t { public function drawBody ( $x , $y ) { echo 'Az Ön vörös teste az x tengelyen =' . $x . ' és y tengely =' . $y . '</br>' . PHP_EOL ; } } class WhiteBody implementálja az IBody-t { public function drawBody ( $x , $y ) { echo 'A fehér tested az x tengelyen =' . $x . ' és y tengely =' . $y . '</br>' . PHP_EOL ; } } /** * Interface ISnowman - ez absztrakt gyári */ interface ISnowman { public function drawHead ( $x , $y ); publikus függvény drawBody ( $x , $y ); } /** * Class WhiteSnowman - betongyár */ osztály WhiteSnowman implements ISnowman { protected $head ; védett $test ; public function __construct () { $this -> head = new WhiteHead (); $this -> body = new WhiteBody (); } public function drawHead ( $x , $y ) { $this -> head -> drawHead ( $x , $y ); } public function drawBody ( $x , $y ) { $this -> body -> drawBody ( $x , $y ); } } /** * Class RedSnowman - betongyár */ osztály RedSnowman implements ISnowman { protected $head ; védett $test ; public function __construct () { $this -> head = new RedHead (); $this -> body = új RedBody (); } public function drawHead ( $x , $y ) { $this -> head -> drawHead ( $x , $y ); } public function drawBody ( $x , $y ) { $this -> body -> drawBody ( $x , $y ); } } function hóember ( ISnowman $hóember ) { $hóember -> drawHead ( 1 , 1 ); $hóember -> drawBody ( 1 , 2 ); } $typeSnowman = 'piros' ; // kiválasztjuk a család típusát a kód elején if ( $typeSnowman == 'red' ) $hóember = new RedSnowman (); else $hóember = új FehérHóember (); hóember ( $hóember );

Python példa

Forráskód Pythonban abc importból ABCMeta , abstractmethod _ osztály Sör ( metaclass = ABCMeta ): passz osztály Snack ( metaosztály = ABCMeta ): @abstractmethod def interact ( self , beer : Beer ) -> None : pass osztály AbstractShop ( metaclass = ABCMeta ): @abstractmethod def buy_beer ( self ) -> Beer : passz @abstractmethod def buy_snack ( self ) -> Snack : passz osztály Tuborg ( Beer ): bérlet osztály Staropramen ( Sör ): bérlet osztály földimogyoró ( Snack ): def interact ( self , beer : Beer ) -> None : print ( 'Megittunk egy üveg sört {} és megettük mogyoróval' . format ( sör . __class__ . __name__ )) osztályú chips ( Snack ): def interact ( self , beer : Beer ) -> None : print ( 'Ittunk néhány sört {} és ettünk egy zacskó chipset' . format ( sör . __class__ . __name__ )) osztályú ExpensiveShop ( AbstractShop ): def buy_beer ( self ) -> Beer : return Tuborg () def buy_snack ( self ) -> Snack : return Mogyoró () osztályú CheapShop ( AbstractShop ): def buy_beer ( self ) -> Beer : vissza Staropramen () def buy_snack ( self ) -> Snack : chipek visszaküldése () if __name__ == '__main__' : drága_bolt = DrágaShop ( ) cheap_shop = OlcsóBolt () print ( 'OUTPUT:' ) sör = drága_bolt . vásárol_sört () snack = olcsó_bolt . buy_snack () snack . interact ( sör ) sör = olcsó_bolt . vásárol_sört () snack = drága_bolt . buy_snack () snack . interakció ( sör ) ''' KIMENET: Ittunk néhány doboz Tuborg sört és ettünk egy zacskó chipset Megittunk egy üveg Staropramen sört és megharaptuk mogyoróval '''

Scala példa

Scala forráskód abstract class AbstractTerrestrialAnimal { def walk : String } absztrakt osztály _ _ def swim : húr _ absztrakt osztály _ _ def getCity : String def getTerrestrialAnimal : AbstractTerrestrialAnimal def getWaterAnimal : AbstractWaterAnimal } osztály Wolverine extends AbstractTerrestrialAnimal { override def walk : String = "Wolverine sétál" } class HoneyBadger extends AbstractTerrestrialAnimal { override def walk : String = "Mézes borz sétál" } class Walrus extends AbstractWaterAnimal { override def swim : String = "Rozmár úszik" } class SeaLion kiterjeszti AbstractWaterAnimal { override def swim : String = "Oroszlánfóka úszik" } class MunichZoo kiterjeszti AbstractZoo { def getCity felülírása : String = "München" felülírás def getTerrestrialAnimal : AbstractTerrestrialAnimal = new Wolverine def getWaterAnimal felülírása : AbstractWaterAnimal = új rozmár } class CapeTownZoo kiterjeszti AbstractZoo { def getCity felülírása : String = "Fokváros" def getTerrestrialAnimal felülírása : AbstractTerrestrialAnimal = új HoneyBadger def getWaterAnimal felülírása : AbstractWaterAnimal = új SeaLion } object AbstractFactoryTest { private def testZoo ( állatkert : AbstractZoo ): Unit = { println ( s"Zoo of ${ zoo . getCity } :" ) println ( állatkert . getTerrestrialAnimal . walk ) println ( állatkert . getWaterAnimal . úszni ) } def main ( args : Array [ String ]) Unit = { testZoo ( new CapeTownZoo ) testZoo ( new MünchenZoo ) } }

Menjen a példa

Forráskód a Go- ban csomag import "fmt" type Unit interface { What () string } type Action interface { What () string } type Place interface { What () string } típus TransportFactory interfész { MakeUnit () Unit MakeAction () Action MakePlace () Hely } típus Car struct {} func ( self Car ) What () string { return "car" } írja be a Ride struct {} karakterláncot func ( self Ride ) What () string { return "ride" } típusú útszerkezet { } func ( self Road ) What () string { return "road" } típus LandTransportFactory struct {} func ( saját LandTransportFactory ) MakeUnit () Unit { return & Car {} } func ( saját LandTransportFactory ) MakeAction () Action { return & Ride {} } func ( saját LandTransportFactory ) MakePlace ( ) Place { return & Road {} } típus Boat struct {} func ( self Boat ) What () string { return "boat" } vitorla szerkezet típusa {} func ( self Sail ) What () string { return "vitorla" } típus Sea struct {} func ( self Sea ) What () string { return "tenger" } típus SeaTransportFactory struct {} func ( saját SeaTransportFactory ) MakeUnit ( ) Unit { return & Boat {} } func ( saját SeaTransportFactory ) MakeAction ( ) Action { return & Sail {} } func ( saját SeaTransportFactory ) MakePlace ( ) Place { return & Sea {} } func action ( gyári TransportFactory ) { unit := factory . MakeUnit () unit_action := gyári . MakeAction () hely := gyár . MakePlace () fmt . Printf ( "A %s %ss a %s felett.\n" , egység . Mit (), egység_akció . Mi (), hely . Mit ()) } func main () { action ( & LandTransportFactory {}) action ( & SeaTransportFactory {}) }

Következtetés

Az autó áthalad az úton. A csónak a tenger felett vitorlázik.

Példa a Rubyban

Ruby forráskód modul AbstractFactoryPattern # Adjon interfészt kapcsolódó vagy objektumcsaládok létrehozásához anélkül, hogy megadná a konkrét osztályokat # Abstract Factory osztály WarriorFactory def create_knight raise NotImplementedError end def create_archer raise NotImplementedError end end # Concrete Factory osztály OrcWarriorFactory < WarriorFactory def create_knight OrcKnight . új vég def create_archer OrcArcher . új vég vége # Concrete Factory osztály ElfWarriorFactory < WarriorFactory def create_knight ElfKnight . új vég def create_archer ElfArcher . új vég vége # Absztrakt termékosztály Knight def ellenőrzi magát . osztály . név . split ( '::' ) . utolsó vég vége # Absztrakt termékosztály Az Archer ellenőrzi magát . osztály . név . split ( '::' ) . utolsó vég vége # Termékosztály OrcKnight < Knight end # Termékosztály ElfKnight < Knight end # Termékosztály OrcArcher < Archer end # Termékosztály ElfArcher < Archer end # Kliens osztály Army def inicializálás ( gyári ) @knights = [] 3 . alkalommal { @lovagok << gyár . lovag létrehozása } @íjászok = [] 3 . alkalommal { @íjászok << gyár . create_archer } end def inspect "Knights #{ @knights . map ( & : inspect ) } Archers #{ @archers . map ( & : inspect ) } " end end def self . fuss orkok = Army . new ( OrcWarriorFactory . new ) "Orcs army: # { orcs . inspect } " manók = hadsereg . new ( ElfWarriorFactory . new ) felteszi az "Elves army: #{ elves . inspect } " end end end AbstractFactoryPattern . fuss # Ork hadsereg: Lovagok ["OrcKnight", "OrcKnight", "OrcKnight"] Íjászok ["OrcArcher", "OrcArcher", "OrcArcher"] # Elfek hadsereg: Lovagok ["ElfKnight", "ElfKnight", "ElfKnight"] Íjászok ["ElfArcher", "ElfArcher", "ElfArcher"]

Irodalom

  • E. Gamma, R. Helm, R. Johnson, J. Vlissides . Objektumorientált tervezés technikái. Tervezési minták = Design Patterns: Az újrafelhasználható objektum-orientált szoftver elemei. - Szentpétervár. : "Péter" , 2007. - S. 366. - ISBN 978-5-469-01136-1 . ( ISBN 5-272-00355-1 is )

Linkek

Jegyzetek

  1. Absztrakt gyári minta . Letöltve: 2013. június 14. Az eredetiből archiválva : 2013. június 14..
  2. Minták generálása: Absztrakt gyár . Letöltve: 2013. június 14. Az eredetiből archiválva : 2013. június 14..
  3. Abstract Factory .NET tervezési minta C# és VB nyelven - dofactory.com . www.dofactory.com Hozzáférés dátuma: 2016. március 3. Az eredetiből archiválva : 2016. március 3.