11α Κατασκευαστικά πρότυπα σχεδίασης · Περιεχόμενα 1....

36
11α Κατασκευαστικά πρότυπα σχεδίασης Τεχνολογία Λογισμικού Σχολή Hλεκτρολόγων Mηχανικών & Mηχανικών Yπολογιστών Εθνικό Μετσόβιο Πολυτεχνείο Χειμερινό εξάμηνο 2017‐18 Δρ. Κώστας Σαΐδης ﴾[email protected]﴿

Upload: others

Post on 17-Aug-2020

6 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 11α Κατασκευαστικά πρότυπα σχεδίασης · Περιεχόμενα 1. Singleton 2. Factory Method 3. Abstract Factory 4. Builder 5. Object Pool 6. Prototype

11α Κατασκευαστικά πρότυπασχεδίασης

Τεχνολογία Λογισμικού

Σχολή Hλεκτρολόγων Mηχανικών & Mηχανικών YπολογιστώνΕθνικό Μετσόβιο Πολυτεχνείο

Χειμερινό εξάμηνο 2017‐18

Δρ. Κώστας Σαΐδης ﴾[email protected]﴿

Page 2: 11α Κατασκευαστικά πρότυπα σχεδίασης · Περιεχόμενα 1. Singleton 2. Factory Method 3. Abstract Factory 4. Builder 5. Object Pool 6. Prototype

Κατασκευαστικά πρότυπα σχεδίασηςΠρότυπα σχετικά με την κατασκευή αντικειμένων / στιγμιοτύπων

2

Page 3: 11α Κατασκευαστικά πρότυπα σχεδίασης · Περιεχόμενα 1. Singleton 2. Factory Method 3. Abstract Factory 4. Builder 5. Object Pool 6. Prototype

Περιεχόμενα1. Singleton

2. Factory Method3. Abstract Factory4. Builder5. Object Pool

6. Prototype

3

Page 4: 11α Κατασκευαστικά πρότυπα σχεδίασης · Περιεχόμενα 1. Singleton 2. Factory Method 3. Abstract Factory 4. Builder 5. Object Pool 6. Prototype

SingletonΣκοπός: Να διαφυλάξει ότι μια κλάση έχει μόνο ένα στιγμιότυπο﴾και να προσφέρει την πρόσβαση σε αυτό﴿

4

Page 5: 11α Κατασκευαστικά πρότυπα σχεδίασης · Περιεχόμενα 1. Singleton 2. Factory Method 3. Abstract Factory 4. Builder 5. Object Pool 6. Prototype

ΠαράδειγμαEager initialization

public class Configuration {  private static final Configuration c = new Configuration();  private Configuration() {    ...  }  public static Configuration getInstance() {    return c;  }}

Από το repo του μαθήματος

5

Page 6: 11α Κατασκευαστικά πρότυπα σχεδίασης · Περιεχόμενα 1. Singleton 2. Factory Method 3. Abstract Factory 4. Builder 5. Object Pool 6. Prototype

Lazy initialization

public class Configuration {  private static Configuration c;    private Configuration() {    ...  }  public static Configuration getInstance() {    if (c == null) {      synchronized(Configuration.class) {        if (c == null) {          c = new Configuration();        }      }    }    return c;  }}

6

Page 7: 11α Κατασκευαστικά πρότυπα σχεδίασης · Περιεχόμενα 1. Singleton 2. Factory Method 3. Abstract Factory 4. Builder 5. Object Pool 6. Prototype

Πραγματικό παράδειγμα ﴾JVM Runtime﴿http://docs.oracle.com/javase/8/docs/api/java/lang/Runtime.html#getRuntime‐‐

7

Page 8: 11α Κατασκευαστικά πρότυπα σχεδίασης · Περιεχόμενα 1. Singleton 2. Factory Method 3. Abstract Factory 4. Builder 5. Object Pool 6. Prototype

ΣυζήτησηΤο singleton πρότυπο εξυπηρετεί όταν θέλουμε ένας"ευαίσθητος" για την εφαρμογή πόρος να αρχικοποιείταιμόνο μία φορά ﴾π.χ. configuration file reader, data accesshandler, κλπ.﴿Προβληματική κληρονομικότητα ﴾λόγω του privateconstructor﴿

Απαιτείται προσεκτική και "φειδωλή" εφαρμογή τουπροτύπου

8

Page 9: 11α Κατασκευαστικά πρότυπα σχεδίασης · Περιεχόμενα 1. Singleton 2. Factory Method 3. Abstract Factory 4. Builder 5. Object Pool 6. Prototype

Factory Method & Abstract FactoryΣκοπός: Να αποκρύψουν τις λεπτομέρειες δημιουργίας"συγγενών" στιγμιοτύπων

9

Page 10: 11α Κατασκευαστικά πρότυπα σχεδίασης · Περιεχόμενα 1. Singleton 2. Factory Method 3. Abstract Factory 4. Builder 5. Object Pool 6. Prototype

Factory Method ﴾aka Virtual constructor﴿Ένα πρόσθετο επίπεδο ανακατεύθυνσης / αφαίρεσης ﴾level ofindirection﴿ στην απευθείας εκτέλεση ενός κατασκευαστή﴾constructor﴿.

Η κλάση ‐ χρήστης βασίζεται στον τύπο των στιγμιοτύπων καιόχι σε συγκεκριμένη κλάση ﴾concrete class﴿.

10

Page 11: 11α Κατασκευαστικά πρότυπα σχεδίασης · Περιεχόμενα 1. Singleton 2. Factory Method 3. Abstract Factory 4. Builder 5. Object Pool 6. Prototype

Παράδειγμαabstract class MVCResource { //controller  abstract User createUser(HttpRequest req)  void doService(HttpRequest req, HttpResponse res) {    User user = createUser(req)    Template tpl = Helper.getTemplateFrom(req)  //view    Context ctx = Helper.createContextFrom(req) //model    tpl.render(user, ctx, res)  }}

11

Page 12: 11α Κατασκευαστικά πρότυπα σχεδίασης · Περιεχόμενα 1. Singleton 2. Factory Method 3. Abstract Factory 4. Builder 5. Object Pool 6. Prototype

class PublicResource extends MVCResource {  User createUser(req) {       String id = req.getCookie().get("session‐id")    if (id) {      User user = SessionDB.getUserFrom(id)      if (user) {        return user //for logging purposes      }    }        return User.ANONYMOUS;  }  }

12

Page 13: 11α Κατασκευαστικά πρότυπα σχεδίασης · Περιεχόμενα 1. Singleton 2. Factory Method 3. Abstract Factory 4. Builder 5. Object Pool 6. Prototype

class ProtectedResource extends MVCResource {  User createUser(req) {    String id = req.getCookie().get("session‐id")    if (id) {      User user = SessionDB.getUserFrom(id)      if (user && user.isAuthorizedFor(this)) {        return user       }    }        throw new AuthorizationException("Not authorized")  }}

13

Page 14: 11α Κατασκευαστικά πρότυπα σχεδίασης · Περιεχόμενα 1. Singleton 2. Factory Method 3. Abstract Factory 4. Builder 5. Object Pool 6. Prototype

ΣυζήτησηΧρήση του προτύπου:

όταν μια κλάση δεν μπορεί να "ξέρει πλήρως" τι στιγμιότυπαθα δημιουργηθούνόταν μια κλάση "θέλει" να μεταθέσει την αρμοδιότηταδημιουργίας στιγμιοτύπων σε υποκλάσεις της

όταν μπορεί να προκύψει σφάλμα ﴾exception﴿ εντός τωνκατασκευαστών ﴾constructors﴿ ώστε να αποφευχθούν"ασυνεπή" στιγμιότυπα

14

Page 15: 11α Κατασκευαστικά πρότυπα σχεδίασης · Περιεχόμενα 1. Singleton 2. Factory Method 3. Abstract Factory 4. Builder 5. Object Pool 6. Prototype

Abstract FactoryΈνα interface δημιουργίας "συγγενών" στιγμιοτύπων

15

Page 16: 11α Κατασκευαστικά πρότυπα σχεδίασης · Περιεχόμενα 1. Singleton 2. Factory Method 3. Abstract Factory 4. Builder 5. Object Pool 6. Prototype

Παράδειγμαclass ShopingCart { 

  private final List<Product> = new ArrayList()

  static Map<String, ProductFactory> factories = [    "Tablet": new TabletFactory(),    "Mobile": new MobileFactory()  ]

  void addProduct(HttpRequest req) {    String family = req.getParameter("family")    ProductFactory factory = factories.get(family)    if (factory) {      products.add(factory.newProduct(req))    }    else {      throw new BadRequestException("Invalid product family")    }  }}

16

Page 17: 11α Κατασκευαστικά πρότυπα σχεδίασης · Περιεχόμενα 1. Singleton 2. Factory Method 3. Abstract Factory 4. Builder 5. Object Pool 6. Prototype

interface ProductFactory {   Product newProduct(HttpRequest req)}

class TabletFactory implements ProductFactory {  Product newProduct(HttpRequest req) {    //process req    return new Tablet(...)  }}

class MobileFactory implements ProductFactory {  Product newProduct(HttpRequest req) {    //process req    return new Mobile(...)  }}

17

Page 18: 11α Κατασκευαστικά πρότυπα σχεδίασης · Περιεχόμενα 1. Singleton 2. Factory Method 3. Abstract Factory 4. Builder 5. Object Pool 6. Prototype

interface Product {   ...}

class Tablet implements Product {  ...}

class Mobile implements Product {  ...}

18

Page 19: 11α Κατασκευαστικά πρότυπα σχεδίασης · Περιεχόμενα 1. Singleton 2. Factory Method 3. Abstract Factory 4. Builder 5. Object Pool 6. Prototype

ΣυζήτησηΧρήση του προτύπου:

όταν μια κλάση είναι ανεξάρτητη του πώς δημιουργούνται ήαναπαρίστανται τα "στοιχεία" που συνθέτει

όταν μια κλάση θα "αποφασίσει" στο runtime τι στιγμιότυπαπρέπει να δημιουργηθούν

19

Page 20: 11α Κατασκευαστικά πρότυπα σχεδίασης · Περιεχόμενα 1. Singleton 2. Factory Method 3. Abstract Factory 4. Builder 5. Object Pool 6. Prototype

Πραγματικό παράδειγμα ﴾XML Parsing﴿https://docs.oracle.com/javase/8/docs/api/javax/xml/parsers/DocumentBuilderFactory.html#newInstance‐‐

20

Page 21: 11α Κατασκευαστικά πρότυπα σχεδίασης · Περιεχόμενα 1. Singleton 2. Factory Method 3. Abstract Factory 4. Builder 5. Object Pool 6. Prototype

BuilderΣκοπός: Να απλοποιήσει τη δημιουργία σύνθετων αντικειμένων﴾που απαιτούν πολλές παραμέτρους﴿

21

Page 22: 11α Κατασκευαστικά πρότυπα σχεδίασης · Περιεχόμενα 1. Singleton 2. Factory Method 3. Abstract Factory 4. Builder 5. Object Pool 6. Prototype

ΠαράδειγμαSomething s = new BuilderOfSomething().                  setAnOption(1).                  setAnother("x").                  setAFlag(false).                  build();

22

Page 23: 11α Κατασκευαστικά πρότυπα σχεδίασης · Περιεχόμενα 1. Singleton 2. Factory Method 3. Abstract Factory 4. Builder 5. Object Pool 6. Prototype

Η υλοποίησηclass BuilderOfSomething {  private Something s;    BuilderOfSomething() {    s = new Something();  }    BuilderOfSomething setAnOption(int option) {    s.setInt(option);    return this; //allows chaining of calls  }    BuilderOfSomething setAnother(String option) {    s.setString(option);    return this;  }      ...    Something build() {    return s;  }} 23

Page 24: 11α Κατασκευαστικά πρότυπα σχεδίασης · Περιεχόμενα 1. Singleton 2. Factory Method 3. Abstract Factory 4. Builder 5. Object Pool 6. Prototype

Πραγματικό Παράδειγμα ﴾Guava Cache﴿Cache<String, X> cache = CacheBuilder.    newBuilder().    maximumSize(100).    expireAfterWrite(1, TimeUnit.MINUTES).    removalListener(    new RemovalListener<String, X>() {      @Override      void onRemoval(RemovalNotification<String, X> n) {        ...      }    }).    build()

24

Page 25: 11α Κατασκευαστικά πρότυπα σχεδίασης · Περιεχόμενα 1. Singleton 2. Factory Method 3. Abstract Factory 4. Builder 5. Object Pool 6. Prototype

If you have a procedure with ten parameters, you probablymissed some.

Alan Perlis

25

Page 26: 11α Κατασκευαστικά πρότυπα σχεδίασης · Περιεχόμενα 1. Singleton 2. Factory Method 3. Abstract Factory 4. Builder 5. Object Pool 6. Prototype

ΣυζήτησηΑποφυγή κατασκευαστών με πολλές παραμέτρους ﴾>6﴿Επιλογή του χρήστη ποια παράμετρο θα θέσει ρητά ﴾οιυπόλοιπες θα πάρουν κάποια default τιμή﴿

Η "κατασκευαστική" διαδικασία πρέπει να υποστηρίζειδιαφορετικές "αναπαραστάσεις" για τα αντικείμενα υπόκατασκευή

26

Page 27: 11α Κατασκευαστικά πρότυπα σχεδίασης · Περιεχόμενα 1. Singleton 2. Factory Method 3. Abstract Factory 4. Builder 5. Object Pool 6. Prototype

Object PoolΣκοπός: Να διατηρήσει "ζωντανά" σε μια μορφή ενδιάμεσηςμνήμης ﴾cache﴿ αντικείμενα των οποίων η κατασκευή είναι"ακριβή"

27

Page 28: 11α Κατασκευαστικά πρότυπα σχεδίασης · Περιεχόμενα 1. Singleton 2. Factory Method 3. Abstract Factory 4. Builder 5. Object Pool 6. Prototype

ΣυζήτησηThread Pools, Connection Pools, κτλ.Μοτίβο borrow & return.Εκ των προτέρων κατασκευή συγκεριμένου πλήθουςαντικειμένων που επαναχρησιμοποιούνται αντί νακατασκευάζονται και να καταστρέφονται σε κάθε χρήση.

Άνω όρια στη δέσμευση πόρων ﴾αποφυγή επιθέσεων τύπουDenial‐Of‐Service﴿.Μικρά όρια μπορεί να μειώσουν την απόδοση.

28

Page 29: 11α Κατασκευαστικά πρότυπα σχεδίασης · Περιεχόμενα 1. Singleton 2. Factory Method 3. Abstract Factory 4. Builder 5. Object Pool 6. Prototype

ΠαράδειγμαDatabase Connection Pool στο repo του μαθήματος

https://github.com/saikos/softeng17b/blob/master/src/main/java/gr/ntua/ece/softeng17b/data/DataAccess.java

29

Page 30: 11α Κατασκευαστικά πρότυπα σχεδίασης · Περιεχόμενα 1. Singleton 2. Factory Method 3. Abstract Factory 4. Builder 5. Object Pool 6. Prototype

Thread Pools ﴾Java 5+ Executors﴿java.util.concurrent.Executors

static ExecutorService newCachedThreadPool()

static ExecutorService newFixedThreadPool()

30

Page 31: 11α Κατασκευαστικά πρότυπα σχεδίασης · Περιεχόμενα 1. Singleton 2. Factory Method 3. Abstract Factory 4. Builder 5. Object Pool 6. Prototype

Από το Javadoc

newFixedThreadPool﴾﴿

Creates a thread pool that reuses a fixed number of threadsoperating off a shared unbounded queue. At any point, at most nthreads will be active processing tasks. If additional tasks aresubmitted when all threads are active, they will wait in the queueuntil a thread is available. If any thread terminates due to a failureduring execution prior to shutdown, a new one will take its place ifneeded to execute subsequent tasks. The threads in the pool willexist until it is explicitly shutdown.

31

Page 32: 11α Κατασκευαστικά πρότυπα σχεδίασης · Περιεχόμενα 1. Singleton 2. Factory Method 3. Abstract Factory 4. Builder 5. Object Pool 6. Prototype

newCachedThreadPool﴾﴿

Creates a thread pool that creates new threads as needed, but willreuse previously constructed threads when they are available.These pools will typically improve the performance of programsthat execute many short‐lived asynchronous tasks. Calls toexecute will reuse previously constructed threads if available. If noexisting thread is available, a new thread will be created and addedto the pool. Threads that have not been used for sixty seconds areterminated and removed from the cache. Thus, a pool that remainsidle for long enough will not consume any resources.

32

Page 33: 11α Κατασκευαστικά πρότυπα σχεδίασης · Περιεχόμενα 1. Singleton 2. Factory Method 3. Abstract Factory 4. Builder 5. Object Pool 6. Prototype

PrototypeΣκοπός: Δημιουργία νέου στιγμιοτύπου από την "αντιγραφή"ενός υπάρχοντος

33

Page 34: 11α Κατασκευαστικά πρότυπα σχεδίασης · Περιεχόμενα 1. Singleton 2. Factory Method 3. Abstract Factory 4. Builder 5. Object Pool 6. Prototype

Java Cloneablehttp://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#clone﴾﴿

34

Page 35: 11α Κατασκευαστικά πρότυπα σχεδίασης · Περιεχόμενα 1. Singleton 2. Factory Method 3. Abstract Factory 4. Builder 5. Object Pool 6. Prototype

ΠαράδειγμαShallow cloning vs deep cloning

https://programmingmitra.blogspot.gr/2016/11/Java‐Cloning‐Types‐of‐Cloning‐Shallow‐Deep‐in‐Details‐with‐Example.html

35

Page 36: 11α Κατασκευαστικά πρότυπα σχεδίασης · Περιεχόμενα 1. Singleton 2. Factory Method 3. Abstract Factory 4. Builder 5. Object Pool 6. Prototype

Copy Constructor patternΕναλλακτική στο cloning

public Person(Person original) {    this.id = original.id + 1;    this.name = new String(original.name);    this.city = new City(original.city);}

36