Refactoring To Patterns
version 0.15
Joshua Kerievsky
joshua@industriallogic.com
Industrial Logic, Inc.
http://industriallogic.com
Table of Contents
Introduction ................... 6
Chain Constructors............................................................................................................ 12
Motivation ............ 13
Mechanics............ 13
Example ................ 13
Chaining To An Init Method ......................................................................................................... 14
Replace Multiple Constructors with Creation Methods....... 15
Motivation ............ 15
Mechanics............ 16
Example ................ 17
Parameterized Creation Methods .............................................................................................. 19
Encapsulate Classes with Creation Methods..................................... 21
Motivation ............ 22
Forces.................... 23
Mechanics............ 23
Example ................ 23
Encapsulating Inner Classes....................................................................................................... 25
Extract Creation Class................................................................................................... 27
Motivation ............ 27
Mechanics............ 28
Example ................ 28
Move Object Composition to Creation Method............................... 31
Motivation ............ 31
Prerequisites....... 31
Mechanics............ 31
Example ................ 31
Replace Multiple Instances with Singleton.......................................... 32
Replace Singleton with Object Reference.............................................. 33
Motivation ............ 33
Replace Singleton with Registry ........................................................................34
Introduce Polymorphic Creation with Factory Method......36
Motivation ............ 37
Forces.................... 37
Mechanics............ 37
Example ................ 38
Duplication Across Subclasses ................................................................................................. 40
Defer Slow Creation with Virtual Proxy................................................. 42
Motivation ............ 43
Mechanics............ 43
Example ................ 43
Replace Conditional Calculations with Strategy ..........................44
Motivation ............ 45
Mechanics............ 45
Example ................ 46
Replace Implicit Tree with Composite........................................................ 53
Motivation ............ 53
Mechanics............ 54
Example ................ 54
Encapsulate Composite with Builder ......................................................... 57
Motivation ............ 57
Mechanics............ 58
Example ................ 58
Extended Example ........................................................................................................................... 60
Extract Special-Case Behavior into Decorators............................ 63
Motivation ............ 64
Mechanics............ 65
Example ................ 65
Collections.synchronizedMap..................................................................................................... 71
Replace Hard-Coded Notifications with Observer...................... 73
Motivation ............ 74
Mechanics............ 75
Example ................ 75
Move Accumulation to Collecting Parameter ................................. 78
Motivation ............ 78
Mechanics............ 79
Example ................ 79
JUnit’s Collecting Parameter....................................................................................................... 82
Replace One/Many Distinctions with Composite......................... 83
Motivation ............ 84
Mechanics............ 84
Example ................ 85
Compose Method................................................................................................................... 86
Motivation ............ 86
Mechanics............ 87
Example 1............. 88
Example 2............. 91
Example 3............. 97
Separate Versions with Adapters ......................................................................99
Motivation .......... 100
Mechanics.......... 100
Example .............. 101
Adapting with Annonymous Inner Classes......................................................................... 106
Adapting Legacy Systems.......................................................................................................... 106
Adapt Interface...................................................................................................................... 107
Motivation .......... 107
Mechanics.......... 108
Example .............. 108
Replace Type with Type-Safe Enum........................................................... 110
Motivation .......... 111
Mechanics.......... 112
Example .............. 112
Replace State-Altering Conditionals with State........................... 118
Motivation .......... 119
Mechanics.......... 120
Example .............. 121
Replace Singleton with Constant.................................................................... 132
Motivation .......... 132
Mechanics.......... 132
Example .............. 132
Replace Retrieval with Listener........................................................................ 133
Motivation .......... 133
Mechanics.......... 133
Example .............. 133
References .................. 134
Appendix A – Naming Conventions .......................................................................................................... 135
Appendix B – Loan Terminology .............................................................................................................. 136
Conclusion ................. 137
Acknowledgements..... 137