Μεθοδολογίες Προγραμματισμού ΙΙ ΣΧΕΔΙΑΣΤΙΚΑ ΠΡΟΤΥΠΑ (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 klasi ConcreteProduct tha ylopoihsei 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 onoma einai: "+name);}} class ProductA extends Product { } class ProductB extends Product { public void writeName(String name) { StringBuilder tempName = new StringBuilder().append(name); System.out.println("To antistrofo tou onomatos einai: " + 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"); } Παναγιώτης Σφέτσος, Μεθοδολογίες Προγραμματισμού ΙΙ
Factory Method (Εργοστάσιο) (4/5) Παράδειγμα 3ο Στο παράδειγμα αυτό θα δημιουργούμε στιγμιότυπα διαφορετικών τύπων σκύλων, ανάλογα με κριτήρια που δίνουμε…. interface Dog {public void ratsa ();} class Poodle implements Dog { public void ratsa() {System.out.println("H ratsa tou skyloy einai: Poodle"); }} class Rottweiler implements Dog { public void ratsa() {System.out.println("H ratsa tou skyloy einai: Rottweiler"); }} class SiberianHusky implements Dog { public void ratsa() {System.out.println("H ratsa tou skyloy einai: 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 = DogFactory.getDog("C"); }} Παναγιώτης Σφέτσος, Μεθοδολογίες Προγραμματισμού ΙΙ
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 { return new MacButton(); }} interface Button {public void paint();} class WinButton implements Button { public void paint() { System.out.println("to koumpi einai typoy: WinButton"); }} class MacButton implements Button { System.out.println("to koumpi einai typoy: 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 { //Override tis 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 { 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(); }} Παναγιώτης Σφέτσος, Μεθοδολογίες Προγραμματισμού ΙΙ