06 Design Patterns Intro
06 Design Patterns Intro
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
Design Patterns
●
“Recipes” for common problems
●
Available on different levels (e.g. system architecture, user interface,
implementation)
●
Usually without any code, at most UML
●
Often just “box-and-line”-diagrams, esp. for architectural patterns
e.g.
back-
end
e.g. e.g.
web web
browser server
Browser
Web Application
Question:
where to put
Database security
features?
Support/HAL/OS
Application Application
Presentation Presentation
Session Session
Transport Transport
Network Network
Data Link Data Link
Physical Physical
Application/
HTTP (HyperText Transfer Protocol) Presentation
UML Code
editor generator
C++
editor
Debugger Project Repository
Java
editor
Code Compiler
analyzer + linker
Before: After:
void display_window_one() { GUIFactory factory;
if (windows) {
Widget w[] = { if (windows) {
new WinButton(), Factory = new WinFactory();
new WinMenu() } else if (OSX) { ... }
};
} else if (OSX) { void display_window_one() {
Widget w[] = { Widget w[] = {
new OSXButton(), factory.createButton(),
new OSXMenu() factory.createMenu()
}; };
} else if [...] w[0].paint();
w[0].paint(); w[1].paint();
w[1].paint(); }
}
28/05/24 Software Engineering - © 2015 Dr. Florian Echtler, Bauhaus-Universität Weimar 28
FactoryMethod
●
Can be used by the AbstractFactory to create new objects
● Replaces explicit new(...) with method
● Central element: static factory method in base class, e.g. static
BaseClass create();
class Stooge {
// Factory Method
public static Stooge create( int choice ) {
if (choice == 1) return new Larry();
else if (choice == 2) return new Moe();
else if (choice == 3) return new Curly();
else return null;
}
public String slap_stick() { return null; }
}
[...]
interface Stooge {
public Stooge clone();
public String slap_stick();
}
class Factory {
private static Stooge s_prototypes[] = {
null, new Larry(), new Moe(), new Curly()
}
public static Stooge make_stooge( int choice ) {
return s_prototypes[choice].clone();
}
}