Ce's, un "static fabrica" metoda?
La metoda statica fabrică model este un mod de a îngloba obiect de creație. Fără o metoda fabrica, te-ar numi pur și simplu clasa's constructor direct: Foo x = new Foo()
. Cu acest model, se va apela metoda fabrica: Foo x = Foo.crea()
. Constructorii sunt marcate privat, astfel încât acestea nu pot fi numite, cu excepția de la în interiorul clasei, și fabrica metoda este marcat ca static
, astfel încât acesta poate fi numit fără a avea un obiect.
Există câteva avantaje la acest model. Unul este faptul că fabrica pot alege din mai multe subclase (sau implementatori de o interfață) și a reveni la asta. Acest mod de apelantul poate specifica comportamentul dorit prin parametri, fără a fi nevoie să știe sau să înțeleagă un potențial complex ierarhie de clase.
Un alt avantaj este, ca și Matthew James au subliniat, controlul accesului pentru o resursă limitată, cum ar fi conexiuni. Aceasta o modalitate de a pune în aplicare bazine de obiecte reutilizabile - în loc de a construi, folosind, și dărâmarea unui obiect, în cazul în care construcția și distrugerea sunt scumpe procese s-ar putea face mai mult sens pentru a construi-le o dată și să le reciclați. Fabrica metoda poate reveni existente, neutilizate obiect instanțiat dacă are unul, sau de a construi unul în cazul în care obiectul conta este sub un prag inferior, sau arunca o excepție sau de a reveni null
daca's de mai sus pragul de sus.
Conform articolului de pe Wikipedia, mai multe metode fabrică, de asemenea, permite interpretări diferite de argument similar tipuri. În mod normal, constructorul are același nume ca și clasa, ceea ce înseamnă că puteți avea doar un singur constructor cu o dat semnătura. Fabrici nu sunt atât de limitate, ceea ce înseamnă că puteți avea două metode diferite care acceptă aceleași tipuri de argumente:
Coordinate c = Coordinate.createFromCartesian(double x, double y)
și
Coordinate c = Coordinate.createFromPolar(double distance, double angle)
Acest lucru poate fi de asemenea utilizat pentru a îmbunătăți lizibilitatea, ca Rasmus note.
NOTA! " metoda statica fabrică e NU la fel ca Metoda Fabrica model" (c) Eficient Java, Joshua Bloch.
Metoda fabrica: "Definește o interfață pentru crearea unui obiect, dar lasă clase care implementează interfața decide ce clasa a instantia. Fabrica metodă permite o clasă amâna instanțierea să subclase" (c) GoF.
"Static fabrica metodă este pur și simplu o metodă statică care returnează o instanță a unei clase." (c) Eficient Java, Joshua Bloch. De obicei, această metodă este într-o anumită clasă.
Diferența:
Ideea-cheie din fabrica static metodă este de a obține controlul asupra obiectului creației și delegat de la constructor la metoda statică. Decizia de obiect pentru a fi creat este ca în Abstract Factory a realizat în afara metodă (în cazul în care comun, dar nu întotdeauna). În timp ce cheia (!) ideea de a Fabrica Metodă este de a delega decizia din ce exemplu de clasă pentru a crea în interiorul Fabrica de Metodă. E. g. clasic Singleton punerea în aplicare este un caz special de metodă statică fabrică. Exemplu de frecvent utilizate metode fabrică statice:
Vom evita oferind acces direct la baza de date conexiuni pentru ei're consumatoare de resurse. Deci, vom folosi o metodă statică fabrică getDbConnection
, care creează o conexiune dacă ne-am're sub limita. În caz contrar, acesta încearcă să ofere un "liber" conexiune, nu cu o excepție, dacă nu există nici una.
public class DbConnection{
private static final int MAX_CONNS = 100;
private static int totalConnections = 0;
private static Set<DbConnection> availableConnections = new HashSet<DbConnection>();
private DbConnection(){
// ...
totalConnections++;
}
public static DbConnection getDbConnection(){
if(totalConnections < MAX_CONNS){
return new DbConnection();
}else if(availableConnections.size() > 0){
DbConnection dbc = availableConnections.iterator().next();
availableConnections.remove(dbc);
return dbc;
}else {
throw new NoDbConnections();
}
}
public static void returnDbConnection(DbConnection dbc){
availableConnections.add(dbc);
//...
}
}
Lizibilitatea poate fi îmbunătățită prin metode fabrică statice:
Compara
public class Foo{
public Foo(boolean withBar){
//...
}
}
//...
// What exactly does this mean?
Foo foo = new Foo(true);
// You have to lookup the documentation to be sure.
// Even if you remember that the boolean has something to do with a Bar
// you might not remember whether it specified withBar or withoutBar.
pentru a
public class Foo{
public static Foo createWithBar(){
//...
}
public static Foo createWithoutBar(){
//...
}
}
// ...
// This is much easier to read!
Foo foo = Foo.createWithBar();
- au nume, spre deosebire de constructori, care poate clarifica cod.
- nu este nevoie pentru a crea un nou obiect la fiecare invocare - obiecte pot fi retinute si refolosite, dacă este necesar.
- poate reveni un subtip de întoarcerea lor de tip, în special, poate întoarce un obiect a cărui clasă de punere în aplicare este necunoscut pentru a apelantului. Acest lucru este foarte valoros și utilizate pe scară largă caracteristică în multe cadre care folosesc interfețe ca revenirea tip de metode fabrică statice.
Totul se reduce la mentenabilitate. Cel mai bun mod de a pune acest lucru este ori de câte ori utilizați "noile" cuvinte cheie pentru a crea un obiect, te're cuplare cod pe care le're scris-o în aplicare.
Fabrica model permite separate cum ai crea un obiect de ceea ce faci cu obiectul. Atunci când creați toate obiectele folosind constructori, sunteți în esență, hard-cabluri codul care folosește un obiect pentru a punerii în aplicare. Codul care folosește un obiect este "depinde" acel obiect. Acest lucru nu poate părea ca o afacere mare pe suprafață, dar atunci când obiectul modificări (cred că de a schimba semnătura constructor, sau subclasarea obiect) trebuie să te duci înapoi și rewire lucruri peste tot.
Astăzi, fabricile au fost în mare măsură ignorate în favoarea utilizării de Injectare Dependență pentru că au nevoie de o mulțime de boiler-cod, care se dovedește a fi un pic cam greu pentru a menține în sine. Injectare dependență este practic echivalent cu fabrici, dar vă permite să specificați modul în care obiecte cu fir împreună declarativ (prin configurare sau adnotări).
Dacă constructorul unei clase este privat atunci nu se poate crea un obiect de clasa din afara lui.
class Test{
int x, y;
private Test(){
.......
.......
}
}
Nu putem crea un obiect de clasa mai sus din afara lui. Deci, nu puteți accesa x, y din afara clasei. Apoi, ceea ce este utilizarea de această clasă?
Aici este Răspunsul : FABRICA metoda.
Adauga mai jos metoda de mai sus, în clasa
public static Test getObject(){
return new Test();
}
Deci, acum puteți crea un obiect pentru această clasă din afara lui. Ca modalitate de...
Test t = Test.getObject();
Prin urmare, o metodă statică care revine obiectului de clasa de executare privată constructor este numit ca FABRICA metoda
.
Am crezut că voi adăuga unele lumina pentru acest post pe ceea ce știu. Am folosit această tehnică pe scară largă în nostru recent proiect android. În loc de crearea de obiecte folosind noul operator de asemenea, puteți folosi metoda statică
a instantia clasa. Codul de listare:
//instantiating a class using constructor
Vinoth vin = new Vinoth();
//instantiating the class using static method
Class Vinoth{
private Vinoth(){
}
// factory method to instantiate the class
public static Vinoth getInstance(){
if(someCondition)
return new Vinoth();
}
}
Metode statice suport condiționată de creare obiect: de Fiecare dată când invoca un constructor, un obiect va fi creată, dar poate nu vrei asta. să presupunem că doriți să verificați unele condiții numai atunci doriți să creați un nou obiect.Nu ar fi crearea unui nou exemplu de Vinoth de fiecare dată, cu excepția cazului în condiție este îndeplinită.
Un alt exemplu luat de la Java.
public static Boolean valueOf(boolean b) {
return (b ? TRUE : FALSE);
}
Această metodă se traduce un boolean primitive valoare într-un Boolean obiect de referință. Anii Boolean.valueOf(boolean)
metoda ilustrează noi, nu creează un obiect. Capacitatea de statică metode fabrică pentru a reveni la același obiect de repetate invocații
permite clase de a menține un control strict asupra a ceea ce există cazuri în orice moment.
Fabrica Static metode este că, spre deosebire de
constructorilor, ei pot reveni un "obiect" de orice subtip de întoarcerea lor tip. O aplicație de această flexibilitate este că un API poate reveni obiecte, fără a face clasele lor publice. Ascunde clasele de implementare în acest mod duce la o foarte compact API.
Calendar.getInstance() este un bun exemplu pentru cele de mai sus, Se creează în funcție de localizare o BuddhistCalendar
, JapaneseImperialCalendar
sau implicit Georgian
.
Un alt exemplu care m-am putut gândi este Singleton model, unde ai face-ți de constructori privat de a crea un propriu
getInstance` metodă prin care să vă asigurați, că nu este întotdeauna doar o singură instanță disponibile.
public class Singleton{
//initailzed during class loading
private static final Singleton INSTANCE = new Singleton();
//to prevent creating another instance of Singleton
private Singleton(){}
public static Singleton getSingleton(){
return INSTANCE;
}
}
O fabrică metodă-o metodă care să rezumate departe instanțierea unui obiect. În general, fabricile sunt utile atunci când știi că ai nevoie de o nouă instanță a unei clase care implementează unele interfata dar nu't știu de punere în aplicare clasă.
Acest lucru este util atunci când se lucrează cu ierarhii de clase legate, un bun exemplu de acest lucru ar fi un GUI toolkit. Ai putea pur și simplu hard-cod de apeluri la constructori pentru beton implementări de fiecare widget, dar dacă ați dorit vreodată pentru a schimba un set de instrumente pentru un alt te'd au o mulțime de locuri pentru a schimba. Apeland la o fabrică reduce cantitatea de cod ar trebui să se schimbe.
Unul dintre avantajele care rezultă din fabrică Statice este că API poate reveni obiecte, fără a face clasele lor publice. Acest lucru duce la foarte compact API. In java acest lucru este realizat prin Colecții de clasa care se ascunde în jurul valorii de 32 de clase care face colecție de API foarte compact.
O metodă statică fabrică este bună atunci când doriți pentru a se asigura că numai un singur exemplu este de gând să se întoarcă la clasa de beton pentru a fi utilizate.
De exemplu, într-o conexiune de date de clasă, poate doriți să aibă doar o singură clasă de a crea conexiunea de date, așa că, dacă vă decideți pentru a comuta de la Mysql la Oracle puteți schimba doar logica într-o singură clasă, și restul cererii va folosi noua conexiune.
Dacă doriți să pună în aplicare baza de date comun, atunci care ar fi, de asemenea, făcut fără a afecta restul cererii.
Acesta protejează restul cererii la modificările pe care le pot face la fabrica, care este scopul.
Motivul pentru aceasta să fie static este, dacă doriți să urmăriți de niște resurse limitate (numărul de conexiuni soclu sau fișier mânere), atunci această clasă pot urmări cât de multe au fost leșinat și s-a întors, astfel încât să don't de evacuare resursă limitată.
static
Un membru declarate cu cuvântul cheie 'static'.
metode fabrică
Metode de a crea și de a reveni obiecte noi.
în Java
Limbajul de programare este relevantă pentru sensul de 'static', dar nu la definirea 'fabrica'.
Implementarea Java conține utilități clase java.util.Tablouri și java.util.Colecții ambele dintre ele conține metode fabrică statice, exemple de ea și cum să utilizați :
Tablouri.asList("1","2","3")
Colectiile.synchronizedList(..), Colecții.emptyList(), Colecții.unmodifiableList(...)` (Doar câteva exemple, ar putea verifica javadocs pentru mor metode de exemple https://docs.oracle.com/javase/8/docs/api/java/util/Collections.html)
De asemenea, java.lang.String clasa au astfel de metode fabrică statice:
Șir de caractere.format(...), String.valueOf(..), String.copyValueOf(...)
Unul dintre avantajele metodelor fabrică statice cu privat constructor(creare obiect trebuie să fi fost restricționat pentru extern clase pentru a se asigura cazuri nu sunt create pe plan extern) este că puteți crea exemplu controlate clase. Și exemplu controlate clase garanta că nu există două egale distincte cazuri există(o.equals(b) dacă și numai dacă a==b) în timpul programului se execută asta înseamnă că puteți verifica egalitatea de obiecte cu == operator în loc de egal metodă, în conformitate cu java.
capacitatea De a fabrica static metode pentru a reveni la același obiect de invocări repetate permite clase de a menține un control strict asupra ce cazuri există în orice moment. Clasele care fac acest lucru sunt spus să fie exemplu-controlate. Există mai multe motive pentru a scrie exemplu controlate de clase. Exemplu de comandă permite o clasă la garanție că acesta este un singleton (punctul 3) sau noninstantiable (punctul 4). de Asemenea, permite o imuabil class (Element 15) pentru a garanta că nu există două egale cazuri există: a.equals(b) dacă și numai dacă a==b. Dacă o clasă face această garanție, atunci clienții săi pot folosi == operator în loc de equals(Object) metodă, care poate duce la îmbunătățirea performanță. Enum tipuri (punctul 30) oferă această garanție.
De la Java, Joshua Bloch(Articol 1,pagina 6)