Gyár programtervezési minta

Gyártó metódus a LePUS3-ban

Az objektumorientált programozásban a gyár egy olyan objektum, amely más objektumokat hoz létre.[1] Formálisan, a gyár függvény vagy metódus, ami paramétertől függően különböző prototípusú vagy osztályú objektumokat ad vissza. Tágabb értelemben véve a gyártó metódus egy szubrutin, ami új objektumot ad vissza. A gyár az objektumorientált programozás egyik alapfogalma, és több tervminta alapját képezi. A gyár és a gyártó programtervezési minták létrehozási minták.

Motiváció

Az osztály alapú programozásban a gyár egy osztály konstruktorának absztrakciója, míg a prototípus alapú programozásban a gyár egy prototípus objektum absztrakciója. Egy konstruktor konkrét abban, hogy egyetlen osztály példányait hozza létre; ezzel szemben egy gyár különböző osztályú objektumokat (termékek) készít, és nem feltétlenül hív konstruktort, hanem kezelhet objektumkészletet is. Egy prototípus objektum konkrét abban, hogy klónozás céljára hoz létre objektumokat, míg egy gyár többféle prototípust képes klónozni.

A gyárt többféleképpen lehet hívni, többnyire metódushívással (gyártó metódus), néha pedig függvényhívással, ha a gyár függvény objektum. Egyes nyelvekben a gyár a konstruktor általánosítása, ami azt jelenti, hogy a konstruktorok is gyártó függvények, és egy gyártó függvény úgy hívható, mint egy konstruktor. Más nyelvek megkülönböztetik a kettőt, és a konstruktor hívása különbözik a metódushívástól (new kulcsszó). Ezekben a nyelvekben a gyártó függvény a konstruktor absztrakciója, de nem általánosítása, mivel maguk a konstruktorok nem gyártó függvények.

Fogalmi rendszerezés

A fogalomalkotás megkülönböztetheti magát a gyár fogalmát (absztrakt gyár programtervezési minta) és a gyártó metódust. Gammáék ( Erich Gamma, Richard Helm, Ralph Johnson és John Vlissides) könyvükben (Design Patterns: Elements of Reusable Object-Oriented Software) így rendszerezik a mintákat.[2][3] Vannak más források, amelyek nem különítik el a kettőt.[4] Megint mások a gyártó fogalmát olyan esetekre használják, amelyek összetettebbek, és több gyárat tartalmaznak; ebben a megfogalmazásban a gyárra magára egyszerű gyárként hivatkoznak.[4] Egyes nyelvek, mint például a Python is használják a factory szót.[5] Általánosabban szubrutin vagy metódus is lehet gyártó.[6] Mivel egyes nyelvekben a gyárakat egy metódus hívásával hívják, a gyár általános fogalma összetéveszthető a gyártó metódussal.

Használata

Az objektumorientáltság többféle lehetőséget is nyújt a polimorfizmusra. Ha altípusos polimorfizmust használunk, akkor egy bázis osztályú objektum értékként kaphat leszármazott osztályú objektumot értékül. Ha ez felüldefiniál egy metódust, akkor a híváskor a leszármazott osztály metódusa hívódik meg. Konstruktorokra viszont ez nem működik, mivel a konstruktor nem öröklődik, hiszen a konstruktor nem használja, hanem létrehozza az objektumot.

A konstruktorok hívását és a prototípusok klónozását gyártókra bízva lehetővé válik, hogy a kliens szemszögéből a polimorfizmus kiterjedjen az objektumok létrehozására is. Eszerint a kliensnek ne kell ismernie a pontos típust, tehát az összecsomagolható a gyárral, és a klienstől függetlenül kezelhető, legfeljebb át kell írni egy helyen a paramétereket, vagy a beállítási lehetőségeket megváltoztatni.

Amely nyelvekben a gyártó függvény általánosítja a konstruktort, gyártó függvény hívható bárhol, ahol konstruktor is. A kliens csak meghív egy metódust, amiből kap egy adott osztályú objektumot. Nem kell azzal foglalkoznia, hogy pontosan milyen osztályú.

Például Pythonban a collections.defaultdict osztály konstruktora egy defaultdict típusú objektumot hoz létre, aminek alapértelmezett értékeit egy gyár objektum adja.[7] A gyár objektumot paraméterként megkapja egy konstruktor, és maga is lehet konstruktor, vagy bármi, ami konstruktorként működik: egy hívható objektum, ami visszaad egy értéket. Például a list konstruktor a listákra:

# collections.defaultdict([default_factory[, ...]])
d = defaultdict(list)

Gyárak használhatók akkor is, ha az objektumok létrehozása bonyolultabb folyamat, mint egy konstruktorhívás. Magában foglalhat bonyolult allokációt vagy inicializációt. A szükséges folyamatok közé tartozik a termék pontos típusának meghatározása, életciklusának kezelése, és a konstrukción túl menő inicializálása, vagy a destrukció előkészítése. A gyár dönthet úgy, hogy dinamikusan választja ki a termék osztályát, visszaadja az objektumkészletnek, bonyolult beállításokat végez róla, vagy más, bonyolult műveleteket végez. Ez az ő magánügye. Általánosabb értelemben a szingleton is gyár, csak speciális, mivel létrehoz egy (és csak egy) objektumot.

Példák

A gyár legegyszerűbb példája az egyszerű gyártó függvény, ami meghívja a konstruktort és visszaadja az értéket. Pythonban az f függvény, ami az A osztályt példányosítja, így implementálható:

def f():
    return A()

Egyszerű gyártó függvény a szingleton minta számára:

def f():
    if f.obj is None:
        f.obj = A()
    return f.obj

f.obj = None

Ez először hívva egy új objektumot ad; a további hívásokra ugyanezt az objektumot adja.

Szintaxis

Gyárak hívhatók többféleképpen is, többnyire gyártó metódussal. Ha a gyár hívható objektum, akkor függvényként hívják. Vannak nyelvek, például Python, Perl, Ruby, Object Pascal és F#, amelyekben a konstruktorok és a gyárak hívásának szintaxisa megegyezik, ami lehetővé teszi, hogy a konstruktorokat transzparensen lehessen helyettesíteni gyárakkal. Más nyelvekben a könnyű cserélhetőség interfészek közbeiktatásával oldható meg.

Szemantika

Azokban a nyelvekben, amelyek az objektumokat dinamikusan allokálják, mint Javában és Pythonban, a gyárak szemantikusan ekvivalensek a konstruktorokkal. Más nyelvek, mint a C++ megengedik objektumok statikus allokálását, a gyárak szemantikusan elkülönülnek a statikusan allokált objektumok konstruktoraitól, mivel ez utóbbiaknak tárigénye fordítás időben ismert, és a gyárak termékeinek tárigényét futás időben kell számítani. Ha egy konstruktor paraméterként átadható egy függvénynek, akkor a konstruktorhívás és a termék allokációja dinamikusan, fordítás időben kell, hogy végbemenjen. Ennek a szintaxisa ugyanaz, vagy hasonlít egy gyár hívására.

Tervminták

Gyárakat többféle programtervezési minta használ, speciálisan a létrehozási minták. Egyes speciális eseteket sok különböző nyelven is megvalósítottak. Például Gammáék egyes mintái, mint a gyártó metódus, az építő vagy az egyke ennek a fogalomnak a különböző megvalósításai. Az absztrakt gyártó több gyár együttműködését tartalmazza.

Egyes tervmintákban a gyár objektumnak minden legyártandó objektumra van metódusa. Ezek fogadhatnak paramétereket, amelyek meghatározhatják, hogy milyen objektumot gyártson.

Felhasználása

A gyárak gyakori összetevői a keretrendszereknek és az eszközkészleteknek, ahol a könyvtári kód olyan objektumok létrehozását igényli, amelyeknek típusát a keretrendszert használó alkalmazások származtatják le. A tesztvezérelt fejlesztésben is használják, hogy teszt alá vonják az osztályokat.[8]

A gyárak meghatározzák a termék pontos típusát, és aktuálisan legyártják a terméket. Ha a gyár csak egy absztrakt interfészt ad, akkor a kliens nem fog tudni a konkrét típusról, és nem is lesz szüksége rá. Az absztrakt gyár azonban ismeri a pontos típust. Ez részletesen kifejtve a következőt jelenti:

  • A kliens kód a pontos típus ismerete nélkül működik. Ez azt jelenti, hogy nem is kell include-olnia, használnia, vagy importálnia a konkrét osztályokat. Elég az absztrakt interfészt ismernie, annak a műveleteit hívogathatja.
  • Az új konkrét típus hozzáadása lényegében elkerülheti a klienst. Azt az osztályt, vagy dokumentumot is kis mértékben kell módosítani, ami a beállításokhoz szükséges, illetve a lehetséges típusokhoz hozzáadni az új konkrét típust, ami üzenetként átmegy a kliensen. A legtöbb módosítást a gyáron kell végezni, ott kell megadni, hogy a paraméter melyik értékéhez tartozik az új konkrét típus, ott kell meghívni a konstruktort, és ott kell végső beállításokat végezni az újfajta terméken. A gyár nélkül mindenütt módosítani kellene a kódot, ahol a konstruktort hívnánk.

Felhasználhatósága

Gyárak használhatók, ha:

  • Az objektum létrehozása lehetetlenné tenné az újrafelhasználást a kód másolása nélkül
  • Az objektum létrehozása olyan információt vagy forrásokat igényelne, amit nem adnánk az osztályt felhasználó kódnak
  • Az objektum életciklusának kezelését központosítani kell, hogy az alkalmazás zavartalanul működhessen.

Párhuzamos osztályhierarchiák gyakran azt követelik, hogy az egyik hierarchia tagjai a másik hierarchia megfelelő tagjait hozzák létre. Azaz a gyárak hierarchiájának meg kell egyeznie a termékekével.

A gyártó metódusok felhasználhatók a tesztvezérelt fejlesztésben: Tegyük fel, hogy a Foo osztály létrehoz egy Dangerous (Veszélyes) osztályú objektumot, amit nem lehet közvetlenül teszt alá vonni.[8] Ennek az lehet az oka, hogy adatbázissal kommunikál, ami nem biztos, hogy mindig rendelkezésre áll. Ekkor a tesztelő létrehoz egy gyártó metódust a Foo osztályban, ami egy Dangerous objektumot ad vissza, és a konstruktort ennek közvetítésével hívja meg. Ezután származtatja a Foo osztályból a TestFoo osztályt, ahol felüldefiniálja a createDangerous metódust, és egy másik, a Dangerous osztállyal azonos felületű objektumot ad vissza a FakeDangerous osztályból, ez egy mock objektum. Az egységtesztek a TestFoo osztályt tesztelik anélkül, hogy a valódi Dangerous objektummal kellene bajlódniuk.

Előnyei és változatai

Beszélő nevek

A legtöbb programozási nyelvben a konstruktornak kötelezően az osztály nevét kell viselnie. Ez többértelműséghez vezethet. Ezek a megkötések nem vonatkoznak a gyártó metódusokra, lehet beszélő nevük. Például, ha két valós szám, mint paraméter megadásával hívható a komplex szám konstruktora, akkor csak a paraméterek neve adhat arról információt, hogy Descartes- vagy polárkoordinátákról van-e szó. Gyártó metódusokkal azonban ez egyértelműbb lehet. Ezt az alábbi példa mutatja be C#-ban:

    public class Complex
    {
        public double real;
        public double imaginary;

        public static Complex FromCartesian(double real, double imaginary)
        {
            return new Complex(real, imaginary);
        }

        public static Complex FromPolar(double modulus, double angle)
        {
            return new Complex(modulus * Math.Cos(angle), modulus * Math.Sin(angle));
        }

        private Complex(double real, double imaginary)
        {
            this.real = real;
            this.imaginary = imaginary;
        }
    }

Complex product = Complex.FromPolar(1, Math.PI);

Ekkor a konstruktort gyakran priváttá teszik, hogy a klienseket rákényszerítsék a gyártó metódusokra.

Egységbe zárás

A gyártó metódusok magukba zárják a termék objektumok létrehozását. Ez hasznos lehet, ha az objektum létrehozása bonyolult, például függhet konfigurációs fájloktól vagy felhasználói bemenettől.

Például a képnézegető különféle képeket nyit meg, és minden típushoz más olvasó osztályt kell használnia. Valahányszor megnyit egy képet, a fájl elején található információ alapján kell kiválasztania a megfelelő olvasó osztályt. Ezt a logikát egy gyár tartalmazhatja, amire gyakran egyszerű gyárként hivatkoznak.

Alábbi példák Java és PHP nyelven:

Java

public class ImageReaderFactory {
    public static ImageReader createImageReader(ImageInputStreamProcessor iisp) {
        if (iisp.isGIF()) {
            return new GifReader(iisp.getInputStream());
        }
        else if (iisp.isJPEG()) {
            return new JpegReader(iisp.getInputStream());
        }
        else {
            throw new IllegalArgumentException("Unknown image type.");
        }
    }
}

PHP

class Factory
{
    public static function build($type)
    {
        $class = 'Format' . $type;
        if (!class_exists($class)) {
            throw new Exception('Missing format class.');
        }
        return new $class;
    }
}

interface FormatInterface {}

class FormatString implements FormatInterface {}
class FormatNumber implements FormatInterface {}

try {
    $string = Factory::build('String');
} catch (Exception $e) {
    echo $e->getMessage();
}

try {
    $number = Factory::build('Number');
} catch (Exception $e) {
    echo $e->getMessage();
}

Korlátjai

A gyártó metódussal szemben három akadály merülhet fel. Az első a kód refaktorálásához, a másik kettő pedig az öröklődéshez kapcsolódik.

  • Az első lehetséges probléma lehet a kliens osztályok törése. Ha például a Complex egy szokásos módon működő osztály, akkor a kliensek tele lehetnek a következővel:
Complex c = new Complex(-1, 0);
Miután azonban beüzemeljük a gyárat, megváltoztatjuk az osztályt. A konstruktor priváttá tétele miatt az addig forduló kód akár számos hibát is jelezhet. Ha a konstruktor nem privát, akkor ugyan fordul a kód, de megkérdőjeleződhet a tervminta értelme.
  • Egy másik korlát, hogy a termékből nem lehet származtatni, ha a konstruktor privát. Ekkor ugyanis az alosztályok nem tudják hívni. Ezen lehet segíteni protected konstruktorral.
  • A harmadik korlát ebben az esetben is fennáll, ugyanis az alosztályoknak újra kell implementálniuk az öröklött gyártó metódusokat egy anomália miatt. Különben a metódus visszatérési értéke egy ősosztály típusú objektum lesz, vagyis a visszaadott objektum elfelejti, hogy ő valójában egy utód osztály példánya. Ezt reflexióval ki lehet védeni.

Mindhárom lehetséges probléma megoldható azzal, hogy a nyelv a gyárakat elsőosztályú tagokként kezeli.[9]

Fordítás

Ez a szócikk részben vagy egészben a Factory (object-oriented programming) című angol Wikipédia-szócikk 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.

Jegyzetek

  1. Gamma, Erich. Design Patterns. Addison-Wesley, 18–19. o. (1994). ISBN 9780321700698 
  2. "Factory Pattern", OODesign.com
  3. Factory Pattern, WikiWikiWeb
  4. a b Chapter 4. The Factory Pattern: Baking with OO Goodness Archiválva 2017. március 11-i dátummal a Wayback Machine-ben: The Simple Factory defined Archiválva 2014. február 19-i dátummal a Wayback Machine-ben
  5. "30.8 Classes Are Objects: Generic Object Factories", Learning Python, by Mark Lutz, 4th edition, O'Reilly Media, Inc., ISBN 978-0-596-15806-4
  6. Factory Method, WikiWikiWeb
  7. defaultdict objects
  8. a b Feathers, Michael (October 2004), Working Effectively with Legacy Code, Upper Saddle River, NJ: Prentice Hall Professional Technical Reference, ISBN 978-0-13-117705-5
  9. Agerbo, Ellen (1998). „How to preserve the benefits of design patterns”. Conference on Object Oriented Programming Systems Languages and Applications, Vancouver, British Columbia, Canada, 134–143. o, Kiadó: ACM. 

Read other articles:

Simon and GarfunkelSimon and Garfunkel tampil pada New Orleans Jazz and Heritage Festival tahun 2010Informasi latar belakangAsalForest Hills, Queens, New York City, NY, Amerika SerikatGenreFolk rockTahun aktif1957-19701982-19832003-2004LabelColumbiaSitus webwww.simonandgarfunkel.comAnggotaPaul SimonArt Garfunkel Simon and Garfunkel adalah duo penyanyi lagu Folk asal Amerika Serikat yang terdiri dari Paul Simon dan Arthur Art Garfunkel. Duo penyanyi ini terkenal dengan harmoni musik yang canti...

 

 

Peta infrastruktur dan tata guna lahan di Komune Panazol.  = Kawasan perkotaan  = Lahan subur  = Padang rumput  = Lahan pertanaman campuran  = Hutan  = Vegetasi perdu  = Lahan basah  = Anak sungaiPanazol merupakan sebuah komune di departemen Haute-Vienne di Prancis. Lihat pula Komune di departemen Haute-Vienne Referensi INSEE lbsKomune di departemen Haute-Vienne Aixe-sur-Vienne Ambazac Arnac-la-Poste Augne Aureil Azat-le-Ris Balledent La Bazeuge Beaumon...

 

 

Artikel ini sebatang kara, artinya tidak ada artikel lain yang memiliki pranala balik ke halaman ini.Bantulah menambah pranala ke artikel ini dari artikel yang berhubungan atau coba peralatan pencari pranala.Tag ini diberikan pada Januari 2023. Jack BurkmanJack Burkman pada Agustus 2020Lahir1965/1966 (umur 57–58)[1]Pittsburgh, Pennsylvania[2]KebangsaanAmerika SerikatPendidikanUniversitas Pittsburgh (BA)Universitas Georgetown (MSFS, JD)PekerjaanPembuat teori konspir...

Kesultanan Peureulakکسلطانن ڤورولقKesultanan Perlak840–1292Peta kerajaan Islam Peureulak dan Pasai.Ibu kotaPureulakBahasa yang umum digunakanAceh, MelayuAgama IslamPemerintahanMonarkiSultan • 860–864 Sultan Alaiddin Syed Maulana Abdul Aziz Shah• 1267–1292 Sultan Makhdum Alaiddin Malik Abdul Aziz Johan Berdaulat Sejarah • Didirikan 840• Digabungkan dengan Samudera Pasai 1292 Digantikan oleh Samudera Pasai Sekarang bagian dari I...

 

 

Class of enzymes cutinaseStructure of Fusarium solani cutinase. PDB 1cex.[1]IdentifiersEC no.3.1.1.74DatabasesIntEnzIntEnz viewBRENDABRENDA entryExPASyNiceZyme viewKEGGKEGG entryMetaCycmetabolic pathwayPRIAMprofilePDB structuresRCSB PDB PDBe PDBsumGene OntologyAmiGO / QuickGOSearchPMCarticlesPubMedarticlesNCBIproteins The enzyme cutinase (systematic name: cutin hydrolase, EC 3.1.1.74) is a member of the hydrolase family. It catalyzes the following reaction:CutinaseIdentifiersSymbolCut...

 

 

LifeboatSutradaraAlfred HitchcockProduserKenneth MacgowanSkenarioJo SwerlingCeritaJohn SteinbeckPemeranTallulah BankheadWilliam BendixWalter SlezakMary AndersonJohn HodiakHenry HullHeather AngelHume CronynCanada LeePenata musikHugo W. FriedhoferSinematograferGlen MacWilliamsPenyuntingDorothy SpencerDistributor20th Century FoxTanggal rilis 11 Januari 1944 (1944-01-11) (AS) Durasi96 menitNegaraAmerika SerikatBahasaInggrisAnggaran$1.59 juta[1][2]Pendapatankotor$1 j...

Grade II listed pub in London, England The Castle in FarringdonThe Castle, Cowcross Street, FarringdonGeneral informationAddress34-35 Cowcross StreetTown or cityLondonCountryUnited KingdomGroundbreaking1865Completed1867Design and constructionArchitect(s)H. DawsonWebsitewww.thecastlefarringdon.co.uk The Castle is a Grade II listed public house at 34-35 Cowcross Street, Farringdon, London.[1] A public house of this name has existed on this site since at least the 18th century. Eliza, th...

 

 

1992 United Nations conference For other uses, see Earth Summit (disambiguation). The Earth Summit was a UN event. The United Nations Conference on Environment and Development (UNCED), also known as the Rio Conference or the Earth Summit (Portuguese: ECO92, Cúpula da Terra), was a major United Nations conference held in Rio de Janeiro from 3 to 14 June 1992. Earth Summit was created as a response for member states to cooperate together internationally on development issues after the Cold War...

 

 

Stadion Olimpiade Helsingborg Informasi stadionNama lengkapOlympiaKonstruksiDibuat?–1898Dibuka31 Juli 1898Data teknisKapasitas16.500[1]Ukuran lapangan105 x 68 mPemakaiHelsingborgs IFÄngelholms FF (2014)Sunting kotak info • L • BBantuan penggunaan templat ini Stadion Olimpiade Helsingborg adalah sebuah stadion yang terletak di Helsingborg, Swedia. Stadion ini umumnya dipergunakan untuk menggelar pertandingan sepak bola dan menjadi markas Helsingborgs IF dan Ängelholms...

غومفوي  خريطة الموقع تقسيم إداري البلد اليونان  [1] التقسيم الأعلى بيلي  إحداثيات 39°27′49″N 21°41′33″E / 39.463611111111°N 21.6925°E / 39.463611111111; 21.6925   السكان التعداد السكاني 818 (resident population of Greece) (2021)1054 (resident population of Greece) (2001)1176 (resident population of Greece) (1991)962 (resident population of Greece...

 

 

Patung dada François de Sourdis karya Gianlorenzo Bernini dari sekitar tahun 1620 François d'Escoubleau de Sourdis (25 Oktober 1574 – 1628) adalah seorang prelatus Katolik Prancis, Uskup Agung Bordeaux dan pendiri Irish College pada 1603. Biografi Ia lahir di Châtillon-sur-Sèvre, Poitou, sebagai putra sulung dari pasangan François d'Escoubleau dan Isabeau Babou de la Bourdasière. Referensi Catholic Hierarchy: François d'Escoubleau de Sourdis Diarsipkan 2018-03-16 di Archive.is The Ca...

 

 

Sultans in Egypt from 1174 to 1341 Ayyubid Sultanate of Egyptالأيوبيون (Arabic)al-Ayyūbīyūnئەیووبی (Sorani Kurdish)Eyûbî (Kurdish)1171–1260a/1341 Left: Banner of the Ayyubid dynastyRight: Saladin's personal standardAyyubid Sultanate of Egypt (in pink) at the death of Saladin in 1193StatusSovereign state(1171–1260)Capital Cairo (1171–1174; 1218–1250) Damascus (1174–1218) Aleppo (1250–1260) Hama (until 1341) Common languages Arabic (spoken,&#...

Artikel ini sebatang kara, artinya tidak ada artikel lain yang memiliki pranala balik ke halaman ini.Bantulah menambah pranala ke artikel ini dari artikel yang berhubungan atau coba peralatan pencari pranala.Tag ini diberikan pada April 2016. National Oilwell VarcoJenispublik (NYSE: NOV)IndustrienergiKantorpusatHouston, Texas, Amerika SerikatWilayah operasiSeluruh duniaTokohkunciClay C. Williams(CEO)Pendapatan$22.869 jutaTotal aset$34.812 jutaSitus webwww.nov.com National Oilwell Varco (NYSE:...

 

 

إميليا فهلين   معلومات شخصية الميلاد 24 أكتوبر 1988 (36 سنة)  أوربرو  الطول 176 سنتيمتر  الجنسية السويد  الوزن 65 كيلوغرام  الحياة العملية الفرق كانيون–إس آر إيه إم  [لغات أخرى]‏ (2007–2012)تيم كوب هايتك بوردكتس  [لغات أخرى]‏ (2013–2013)يو أي أيه تيم  [لغ�...

 

 

A muzzle-loading rifle is a muzzle-loaded small arm or artillery piece that has a rifled barrel rather than a smoothbore. The term rifled muzzle loader typically is used to describe a type of artillery piece, although it is technically accurate for small arms as well. A shoulder arm is typically just called a rifle, as almost all small arms were rifled by the time breechloading became prevalent. Muzzle and breechloading artillery served together for several decades, making a clear distinction...

Pour les articles homonymes, voir Fresnoy. Le Fresnoy-Studio national des arts contemporains Histoire et statut Fondation octobre 1997 Type École d'art Administration Directeur Alain Fleischer Localisation Ville Tourcoing Pays France Site web lefresnoy.net Données clés Coordonnées 50° 42′ 00″ nord, 3° 09′ 17″ est Géolocalisation sur la carte : Nord Géolocalisation sur la carte : Métropole européenne de Lille Géolocalisation sur la ca...

 

 

2016年美國總統選舉 ← 2012 2016年11月8日 2020 → 538個選舉人團席位獲勝需270票民意調查投票率55.7%[1][2] ▲ 0.8 %   获提名人 唐納·川普 希拉莉·克林頓 政党 共和黨 民主党 家鄉州 紐約州 紐約州 竞选搭档 迈克·彭斯 蒂姆·凱恩 选举人票 304[3][4][註 1] 227[5] 胜出州/省 30 + 緬-2 20 + DC 民選得票 62,984,828[6] 65,853,514[6]...

 

 

Association football club in Greece Not to be confused with PAE Kerkyra. 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: A.O. Kerkyra – news · newspapers · books · scholar · JSTOR (October 2020) (Learn how and when to remove this message) Football clubAO KerkyraFull nameAthlitikos Omilos Kerkyra(Athletic Clu...

City in California, United States City in California, United StatesEscondido, CaliforniaCity Clockwise: aerial view of Escondido; City Hall; Deer Park Monastery; Center City High School; Downtown FlagSealMotto: City of Choice!Location of Escondido in San Diego County, CaliforniaEscondido, CaliforniaLocation in the state of CaliforniaShow map of CaliforniaEscondido, CaliforniaLocation in the United StatesShow map of the United StatesCoordinates: 33°7′29″N 117°4′51″W / &#...

 

 

Mettmann Stadtwald stationGeneral informationLocationMettmann, North Rhine-WestphaliaGermanyCoordinates51°15′03″N 6°59′16″E / 51.250818°N 6.987876°E / 51.250818; 6.987876Line(s) Düsseldorf-Derendorf–Dortmund Süd (KBS 450.28) S28 Platforms2Other informationStation coden/aDS100 codeKMECategoryN/AFare zoneVRR: 540[1]HistoryOpened26 September 1999 [2]Services Preceding station Rhine-Ruhr S-Bahn Following station Mettmann Zentrumtowards Kaars...