120 likes | 330 Views
Μεθοδολογίες Προγραμματισμού ΙΙ ΣΧΕΔΙΑΣΤΙΚΑ ΠΡΟΤΥΠΑ (2) ΕΦΑΡΜΟΓΕΣ. Παναγιώτης Σφέτσος , PhD http://aetos.it.teithe.gr/~sfetsos/ sfetsos@it.teithe.gr. Factory Method ( Εργοστάσιο) (1/5). Παράδειγμα 1 ο : Υλοποίηση με Concrete Factor (- Creator) interface Product { }
E N D
Μεθοδολογίες Προγραμματισμού ΙΙ ΣΧΕΔΙΑΣΤΙΚΑΠΡΟΤΥΠΑ (2) ΕΦΑΡΜΟΓΕΣ Παναγιώτης Σφέτσος, PhD http://aetos.it.teithe.gr/~sfetsos/ sfetsos@it.teithe.gr
Factory Method (Εργοστάσιο) (1/5) Παράδειγμα 1ο :Υλοποίηση με Concrete Factor (-Creator) interface Product { } class ConcreteProduct implements Product { } //factory abstract class Creator{ public void anOperation(){Product product = factoryMethod();} protected abstract Product factoryMethod();} class ConcreteCreator extends Creator{ protected Product factoryMethod() {System.out.println("H klasiConcreteProductthaylopoihsei to stygmiotypo"); return new ConcreteProduct();}} class Client { public static void main( String arg[] ) { Creator creator = new ConcreteCreator(); creator.anOperation();}} Παναγιώτης Σφέτσος, Μεθοδολογίες Προγραμματισμού ΙΙ
Factory Method (Εργοστάσιο) (2/5) Παράδειγμα 2ο Στο παράδειγμα αυτό το ProductBθα αντιστρέφει το όνομα που εισάγεται. Το ProductΑ απλώς καλείται… abstract class Product { public void writeName(String name) {System.out.println("To onomaeinai: "+name);}} class ProductA extends Product { } class ProductB extends Product { public void writeName(String name) { StringBuildertempName = new StringBuilder().append(name); System.out.println("To antistrofotouonomatoseinai: " + tempName.reverse());}} class ProductFactory { Product createProduct(String type) { if(type.equals("B")) return new ProductB(); else return new ProductA();}} Παναγιώτης Σφέτσος, Μεθοδολογίες Προγραμματισμού ΙΙ
Factory Method (Εργοστάσιο) (3/5) public class TestClientFactory { public static void main(String[] args) { ProductFactory pf = new ProductFactory(); Product prod; prod = pf.createProduct("A"); prod.writeName("Nikas Nikos"); prod = pf.createProduct("B"); prod.writeName("Nikas Nikos"); } } Παναγιώτης Σφέτσος, Μεθοδολογίες Προγραμματισμού ΙΙ
Factory Method (Εργοστάσιο) (4/5) Παράδειγμα 3ο Στο παράδειγμα αυτό θα δημιουργούμε στιγμιότυπα διαφορετικών τύπων σκύλων, ανάλογα με κριτήρια που δίνουμε…. interface Dog {public void ratsa ();} class Poodle implements Dog { public void ratsa() {System.out.println("H ratsatouskyloyeinai: Poodle"); }} class Rottweiler implements Dog { public void ratsa() {System.out.println("H ratsatouskyloyeinai: Rottweiler"); }} class SiberianHusky implements Dog { public void ratsa() {System.out.println("H ratsatouskyloyeinai: Husky"); }} class DogFactory { public static Dog getDog(String criteria) { if ( criteria.equals("A") ) return new Poodle(); else if ( criteria.equals("B") ) return new Rottweiler(); else if ( criteria.equals("C") ) return new SiberianHusky(); return null; }} Παναγιώτης Σφέτσος, Μεθοδολογίες Προγραμματισμού ΙΙ
Factory Method (Εργοστάσιο) (5/5) class JavaFactoryPatternExample { public static void main(String[] args) { Dog dog = DogFactory.getDog("A"); dog.ratsa(); dog = DogFactory.getDog("B"); dog.ratsa(); dog = DogFactory.getDog("C"); dog.ratsa(); }} Παναγιώτης Σφέτσος, Μεθοδολογίες Προγραμματισμού ΙΙ
Abstract Factory(Αφηρημένο Εργοστάσιο) (1/3) Παράδειγμα: Δημιουργία buttons – τύπου Windows ή Mac. Το αποτέλεσμα θα είναι ένα από τα δύο κουμπιά ανάλογα την παράμετρο που δίνουμε. Ο πελάτης (Application) δεν γνωρίζει ποιο GUIFactory δίνεται και ακόμη ποιο κουμπί θα δημιουργηθεί. Παναγιώτης Σφέτσος, Μεθοδολογίες Προγραμματισμού ΙΙ
Abstract Factory(Αφηρημένο Εργοστάσιο) (2/3) interface GUIFactory{public Button createButton();} class WinFactory implements GUIFactory { public Button createButton() { return new WinButton(); }} class MacFactory implements GUIFactory { public Button createButton() { return new MacButton(); }} interface Button {public void paint();} class WinButton implements Button { public void paint() { System.out.println("to koumpieinaitypoy: WinButton"); }} class MacButton implements Button { public void paint() { System.out.println("to koumpieinaitypoy: MacButton"); }} Παναγιώτης Σφέτσος, Μεθοδολογίες Προγραμματισμού ΙΙ
Abstract Factory(Αφηρημένο Εργοστάσιο) (3/3) class Application { public Application(GUIFactory factory){ Button button = factory.createButton(); button.paint(); }} public class ApplicationRunner { public static void main(String[] args) { new Application(createOsSpecificFactory()); } public static GUIFactory createOsSpecificFactory() { int typos = 0; if (typos == 0) { return new WinFactory(); } else { return new MacFactory(); }}} Παναγιώτης Σφέτσος, Μεθοδολογίες Προγραμματισμού ΙΙ
Template Method (Μέθοδος Υπόδειγμα) (1/3) Παράδειγμα: Διαφορετικές υλοποιήσεις μεθόδων σε διαφορετικά φαγητά… abstract class Meal { // template method public final void doMeal() { prepareIngredients(); cook(); eat(); cleanUp();} public abstract void prepareIngredients(); public abstract void cook(); public void eat() {System.out.println("Mmm, poly nostimo...");} public abstract void cleanUp(); } Παναγιώτης Σφέτσος, Μεθοδολογίες Προγραμματισμού ΙΙ
Template Method (Μέθοδος Υπόδειγμα) (2/3) class FrikaseMeal extends Meal { //Overridetis parakatv methodous public void prepareIngredients() {System.out.println("Arnaki, marouli, kremydakia");} public void cook() {System.out.println("Brasimo se hytra h katsarola...");} public void cleanUp() {System.out.println("Plisimo tvn piatvn...");}} class PsitiSardelaMeal extends Meal { //Overridetis parakatv methodous public void prepareIngredients() {System.out.println(“Sardeles me ladi kai lemoni...");} public void cook() {System.out.println("Vazeis tis Sardeles sto tapsi kai tis psineis.....");} public void eat() {System.out.println("Oi psites Sardeles einai poly nostimes...");} public void cleanUp() {System.out.println("Kalo plysimo tvn piatvn");}} Παναγιώτης Σφέτσος, Μεθοδολογίες Προγραμματισμού ΙΙ
Template Method (Μέθοδος Υπόδειγμα) (3/3) public class Demo { public static void main(String[] args) { Meal meal1 = new FrikaseMeal(); meal1.doMeal(); System.out.println(); Meal meal2 = new PsitiSardelaMeal(); meal2.doMeal(); }} Παναγιώτης Σφέτσος, Μεθοδολογίες Προγραμματισμού ΙΙ