9
Design Patterns & Refactoring Factory Methods Oliver Haase HTWG Konstanz Oliver Haase (HTWG Konstanz) Design Patterns & Refactoring 1/9

Design Patterns & Refactoringhaase/lehre/thisterm/pare/slides/p_factory... · product . use ( ) ; g public static void main ( String [ ] args ) throws Exception f GenericCreator

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Design Patterns & Refactoringhaase/lehre/thisterm/pare/slides/p_factory... · product . use ( ) ; g public static void main ( String [ ] args ) throws Exception f GenericCreator

Design Patterns & RefactoringFactory Methods

Oliver Haase

HTWG Konstanz

Oliver Haase (HTWG Konstanz) Design Patterns & Refactoring 1 / 9

Page 2: Design Patterns & Refactoringhaase/lehre/thisterm/pare/slides/p_factory... · product . use ( ) ; g public static void main ( String [ ] args ) throws Exception f GenericCreator

Description

Classification: class based creational pattern

Purpose: Define method for object creation in abstract class, leaveactual creation to concrete subclasses.

Also known as: virtual constructor

Application Example: Framework for document management system

contains abstract classes Application and DocumentApplication implements business logicDocument implements common properties and functionality of alldocument typesApplication knows, when to create documents but not how

Oliver Haase (HTWG Konstanz) Design Patterns & Refactoring 2 / 9

Page 3: Design Patterns & Refactoringhaase/lehre/thisterm/pare/slides/p_factory... · product . use ( ) ; g public static void main ( String [ ] args ) throws Exception f GenericCreator

Structure — using an Example

Oliver Haase (HTWG Konstanz) Design Patterns & Refactoring 3 / 9

Page 4: Design Patterns & Refactoringhaase/lehre/thisterm/pare/slides/p_factory... · product . use ( ) ; g public static void main ( String [ ] args ) throws Exception f GenericCreator

Structure — using an Example

Oliver Haase (HTWG Konstanz) Design Patterns & Refactoring 4 / 9

Page 5: Design Patterns & Refactoringhaase/lehre/thisterm/pare/slides/p_factory... · product . use ( ) ; g public static void main ( String [ ] args ) throws Exception f GenericCreator

General Structure

Oliver Haase (HTWG Konstanz) Design Patterns & Refactoring 5 / 9

Page 6: Design Patterns & Refactoringhaase/lehre/thisterm/pare/slides/p_factory... · product . use ( ) ; g public static void main ( String [ ] args ) throws Exception f GenericCreator

Description II

Members:

Product: base class / interface of the objects to be createdConcreteProduct: concrete productsCreator :

defines factory methodmay provide default implementation that creates certain concreteproductuses factory method, in order to create product objects

ConcreteCreator : overrides / implements factory method, such thatconcrete product is created.

Oliver Haase (HTWG Konstanz) Design Patterns & Refactoring 6 / 9

Page 7: Design Patterns & Refactoringhaase/lehre/thisterm/pare/slides/p_factory... · product . use ( ) ; g public static void main ( String [ ] args ) throws Exception f GenericCreator

Description III

Potential Drawback: Clients (users of the framework) might have toextend Creator class only to define factory method

Relationship with other patterns: Abstract factories often usefactory methods that are overriden by the concrete factories.

Oliver Haase (HTWG Konstanz) Design Patterns & Refactoring 7 / 9

Page 8: Design Patterns & Refactoringhaase/lehre/thisterm/pare/slides/p_factory... · product . use ( ) ; g public static void main ( String [ ] args ) throws Exception f GenericCreator

Additional Considerations

In Java, generic types and reflection can be used to build generic factorymethods→ Creator gets parameterized with concrete product class→ Creator needs not be extended.

Oliver Haase (HTWG Konstanz) Design Patterns & Refactoring 8 / 9

Page 9: Design Patterns & Refactoringhaase/lehre/thisterm/pare/slides/p_factory... · product . use ( ) ; g public static void main ( String [ ] args ) throws Exception f GenericCreator

Additonal Considerations

p u b l i c c l a s s G e n e r i c C r e a t o r <T extends Product> {p r i v a t e C l a s s <T> t y p e ;p u b l i c G e n e r i c C r e a t o r ( C l a s s <T> t y p e ) {

t h i s . t y p e = t y p e ;}p r i v a t e T c r e a t e P r o d u c t ( ) throws E x c e p t i o n {

r e t u r n t y p e . n e w I n s t a n c e ( ) ;}p u b l i c vo id doProduct ( ) throws E x c e p t i o n {

Product p r o d u c t = c r e a t e P r o d u c t ( ) ;p r o d u c t . use ( ) ;

}p u b l i c s t a t i c vo id main ( S t r i n g [ ] a r g s )

throws E x c e p t i o n {G e n e r i c C r e a t o r <ConcreteProduct > c r e a t o r =

new G e n e r i c C r e a t o r <ConcreteProduct >( C o n c r e t e P r o d u c t . c l a s s ) ;

c r e a t o r . doProduct ( ) ;}

}Oliver Haase (HTWG Konstanz) Design Patterns & Refactoring 9 / 9