Am citit modele de design la un site
Acolo am citit despre Fabrica, Fabrica de metodă și Abstract factory dar ele sunt atât de confuz, nu sunt clare cu privire la definirea. În conformitate cu definițiile
Fabrica - Creează obiecte, fără a expune instanțierea logica la client și se Referă la obiectul nou creat printr-o interfață comună. Este o versiune simplificată a Metodei Fabrica
Fabrica de Metoda - Definește o interfață pentru crearea de obiecte, dar lasă subclasele să decidă ce clasă să instantia și se Referă la obiectul nou creat printr-o interfață comună.
Abstract Factory Oferă o interfață pentru a crea o familie de obiecte legate, fără a specifica explicit clasele lor.
M-am uitat, de asemenea, alte stackoverflow fire privire la Abstract Factory vs Metoda Fabrica dar diagrame UML trase acolo face înțelegerea mea chiar mai rău.
Poate cineva te rog spune-mi
Toate cele trei Fabrica tipuri facă același lucru: sunt un "inteligente constructor".
Las's spui că vrei să fii capabil de a crea două tipuri de Fructe: Mere și Portocale.
class FruitFactory {
public Apple makeApple() {
// Code for creating an Apple here.
}
public Orange makeOrange() {
// Code for creating an orange here.
}
}
Caz de utilizare: se Construiește un Mar sau o Portocala este un pic prea complex pentru a ocupa în constructorul pentru fiecare.
abstract class FruitPicker {
protected abstract Fruit makeFruit();
public void pickFruit() {
private final Fruit f = makeFruit(); // The fruit we will work on..
<bla bla bla>
}
}
...apoi, aveți posibilitatea să reutilizați comun funcționalitate în FruitPicker.pickFruit()
prin implementarea metodă fabrică în subclase:
class OrangePicker extends FruitPicker {
@Override
protected Fruit makeFruit() {
return new Orange();
}
}
interface PlantFactory {
Plant makePlant();
Picker makePicker();
}
public class AppleFactory implements PlantFactory {
Plant makePlant() {
return new Apple();
}
Picker makePicker() {
return new ApplePicker();
}
}
public class OrangeFactory implements PlantFactory {
Plant makePlant() {
return new Orange();
}
Picker makePicker() {
return new OrangePicker();
}
}
- Cum sunt aceste trei modele diferite de la fiecare alte?
Fabrică: Creează obiecte, fără a expune instanțierea logica clientului.
Fabrica de Metodă: Definește o interfață pentru crearea unui obiect, dar lasă subclasele să decidă ce clasă să instantia. Fabrica metodă permite o clasă amâna instanțierea să subclase
Abstract Factory: Oferă o interfață pentru crearea de familii înrudite sau dependente de obiecte, fără a preciza clasele de beton.
AbstractFactory model folosește compoziția pentru a delega responsabilitatea de a crea obiect la o altă clasă, în timp ce metoda Fabrica design model foloseste moștenire și se bazează pe clasă derivată sau sub-clasă pentru a crea obiect
- Cand sa folosesti?
Fabrică: Clientul nevoie doar de o clasă și nu-i pasă de ceea ce de punere în aplicare concrete este obtinerea.
Fabrica de Metodă: Clientul nu't știu ce clasele de beton acesta va fi necesar pentru a crea la runtime, dar vrea doar pentru a obține o clasă care va face treaba.
AbstactFactory: atunci Când sistemul trebuie să creeze mai multe familii de produse sau doriți pentru a oferi o bibliotecă de produse, fără a expune detaliile de implementare.
Abstract Factory clase sunt adesea puse în aplicare cu Metoda Fabrică. Fabrica de Metode sunt, de obicei, numit în Șablon Metode.
- Și, de asemenea, dacă este posibil, orice java exemple referitoare la aceste modele?
Fabrică și FactoryMethod
Scop:
Definește o interfață pentru crearea unui obiect, dar lasă-sub-clase decide ce clasa a instantia. Fabrica Metodă permite o clasă amâna instanțiere a sub-clase.
Produs: Se definește o interfață de obiecte Fabrica metodă creează.
ConcreteProduct: Implementează interfața Produsului
Creator: Declară metoda Factory
ConcreateCreator: Implementează metoda Fabrica pentru a reveni un exemplu de un ConcreteProduct
Declarație problemă: de a Crea o Fabrică de Jocuri prin utilizarea de Metode Fabrică, care definește interfața de joc.
Fragment de cod:
Comparație cu alte creatie modele:
Design începe utilizarea Metoda Fabrica (mai puțin complicat, mai personalizabil, subclase prolifera) și să evolueze spre Abstract Factory, Prototip, sau Constructor (mai flexibil, mai complex) ca designer descoperă în cazul în care este necesară mai multă flexibilitate
Abstract Factory clasele sunt adesea puse în aplicare cu Metode Fabrică, dar ele pot fi, de asemenea, puse în aplicare cu ajutorul Prototip
Bibliografie pentru lectură suplimentară: Sourcemaking design-patterns
Fabrica - Separat Fabrica de clasă pentru a crea obiect complex.
Ex: FruitFactory clasă pentru a crea obiectul de Fructe
class FruitFactory{
public static Fruit getFruit(){...}
}
Metoda fabrica - în Loc de întreaga clasă separată pentru fabrica, trebuie doar să adăugați o metodă în clasa în sine ca o fabrică.
Ex:
Calendar.getInstance() (Java's Calendar)
Rezumat Metoda Fabrica - Fabrica de Fabrica
Ex: să spunem că vrem să construim o fabrică de piese de calculator. Deci, există mai multe tipuri de calculatoare cum ar fi Laptop, Desktop, Server.
Deci, pentru fiecare compter tip avem nevoie de fabrică. Deci, vom crea un nivel înalt fabrica de fabrici ca mai jos
ComputerTypeAbstractFactory.getComputerPartFactory(String computerType) ---> This will return PartFactory which can be one of these ServerPartFactory, LaptopPartFactory, DesktopPartFactory.
Acum aceste 3 sine sunt din nou fabrici. (Veți avea de-a face cu PartFactory în sine, dar sub capota, acolo vor fi separate de punere în aplicare bazate pe ceea ce ați furnizat în abstract factory)
Interface-> PartFactory. getComputerPart(String s),
Implementations -> ServerPartFactory, LaptopPartFactory, DesktopPartFactory.
Usage:
new ComputerTypeAbstractFactory().getFactory(“Laptop”).getComputerPart(“RAM”)
EDIT: editat pentru a oferi exact interfețe pentru Abstract Factory ca pe obiecții în comentarii.
Fiecare model de design se bazeaza pentru a vă asigura că scris, codul lucru nu este atins. Știm cu toții că, odată ce ne-am atinge de lucru cod, există defecte în fluxurile de lucru existente, și o mulțime mai mult de testare trebuie făcut pentru a se asigura că nu am rupt nimic.
O fabrică model creează obiecte bazate pe criterii de intrare, asigurându-se astfel că nu este nevoie să scrie cod ca daca acest lucru apoi a crea acest fel de obiect altceva de acest fel de obiect. Un bun exemplu în acest sens este un site de turism. Un site de turism poate oferi doar de călătorie (bilete de avion, tren, autobuz), sau / și oferă hoteluri sau / și oferă o atracție turistică de pachete. Acum, atunci când un utilizator selectează viitoare, site-ul are nevoie pentru a decide ce obiecte are nevoie pentru a crea. Ar trebui să se creeze numai de turism sau hotel, obiect prea.
Acum, dacă vă imaginați adăugând un alt site-ul de portofoliu, și cred că același core fi folosit, de exemplu, un carpooling-ul, care acum caută taxi's și de a face plăți on-line, puteți utiliza un rezumat fabrica de la dumneavoastră de bază. În acest fel aveți posibilitatea să fixați doar într-o fabrica de cabine și carpools.
Atât fabrica's au nimic de-a face unul cu celălalt, așa că un design bun pentru a le menține în diferite fabrica's.
Sper că acest lucru este clar acum. Studiu de site-ul web din nou, păstrând acest exemplu în minte, să sperăm că-l va ajuta. Și chiar sper că am reprezentat modele de corect :).
AbstractProductA, A1 and A2 both implementing the AbstractProductA
AbstractProductB, B1 and B2 both implementing the AbstractProductB
interface Factory {
AbstractProductA getProductA(); //Factory Method - generate A1/A2
}
Folosind Metoda Fabrica, utilizatorul poate capabil de a crea A1 sau A2 de AbstractProductA.
interface AbstractFactory {
AbstractProductA getProductA(); //Factory Method
AbstractProductB getProductB(); //Factory Method
}
Dar Abstract Factory având mai mult de 1 metoda fabrica ( ex: 2 metode fabrică), folosind aceste metode fabrică se va crea un set de obiecte/ obiecte legate. Folosind Abstract Factory, utilizatorul poate capabil de a crea A1, B1 obiecte de AbstractProductA, AbstractProductB
Pentru acest răspuns, mă refer la "Gasca de Patru" carte.
Sunt nu "Fabrica" sau "Simplu de Fabrica" sau "Fabrica Virtuala" definiții în carte. De obicei atunci când oamenii vorbesc despre "Fabrica" modelul se poate vorbi despre ceva care creează un anumit obiect dintr-o clasă (dar nu "constructor" model); au pot sau nu pot se referă la "Metoda Fabrica" sau "Rezumat Fabrica" modele. Oricine poate pune în aplicare "Fabrica" ca el a castigat't pentru l's nu este un termen formal (bear în vedere faptul că unii oameni\companii\comunitățile pot avea propriul lor vocabular).
Cartea doar conține definiții pentru "Rezumat Fabrica" și "Metoda Fabrica".
Aici sunt definiții din carte și o scurtă explicație de ce ambele pot fi atât de confuz. Am omite exemple de cod pentru că le puteți găsi în alte raspunsuri:
Metoda fabrica (GOF): Definește o interfață pentru crearea unui obiect, dar lasă subclasele să decidă ce clasă să instantia. Fabrica Metodă permite o clasă amâna instanțierea să subclase.
Abstract Factory (GOF): Oferă o interfață pentru crearea de familii înrudite sau dependente de obiecte, fără a preciza clasele de beton.
Sursă de Confuzie: de multe ori, se poate apela o clasă, care a folosit în "Metoda Fabrica" model ca "Fabrica". Această clasă este abstractă prin definiție. Ca's de ce-l ușor pentru a apela această clasă "Rezumat Fabrica". Dar's doar numele clasei; ar't confunda cu "Rezumat Fabrica" model (clasa nume != numele de model). "Rezumat Fabrica" model este diferit - este nu utilizați o clasă abstractă; ea definește o interfață (nu neapărat un limbaj de programare interface) pentru crearea de piese de o mai mare obiect sau obiecte care sunt legate între ele sau trebuie să fie creat într-un anumit fel.
Nimeni nu a citat cartea originală Design Patterns: Elements of Reusable Object-Oriented Software, care dă răspunsul în primele două paragrafe din secțiunea "Discuții de Creatie Modele" (sublinierea mea):
Există două modalități comune de a parametriza un sistem de clase de obiecte se creează. O modalitate este de a subclasa clasa care creează obiecte; aceasta corespunde folosind Metoda Factory (107) model. Principalul dezavantaj al acestei abordări este că se poate solicita o nouă subclasă doar pentru a schimba clasa a produsului. Astfel de modificări pot cascadă. De exemplu, atunci când produsul creator în sine este creat de o fabrica de metodă, atunci trebuie să suprascrie creatorul său, precum și.
un alt mod De a parametriza un sistem se bazează mai mult pe obiect compoziție: Defini un obiect care este responsabil pentru cunoașterea clasei de produse de obiecte, și de a face un parametru de sistem. Acesta este un aspect cheie al Abstract Factory (87), Constructor (97), și Prototip (117) modele. Toate cele trei implică crearea unui nou "fabrica de obiect", a căror responsabilitate este de a crea produse de obiecte. Abstract Factory a fabrica obiect producerea de obiecte din mai multe clase. Constructorul a fabrica obiect construirea unui complex produs treptat, folosind-o în mod corespunzător complex de protocol. Prototipul a fabrica obiect construirea unui produs prin copierea unui obiect prototip. În acest caz, fabrica de obiect și prototip sunt același obiect, pentru că prototipul este responsabil pentru returnarea produsului.