Factory Method Abstract Factory and More Making the
Factory Method, Abstract Factory, and More Making the Concrete Abstract 1
Brain surgery is not necessary when putting on a hat Open/Closed Principle Yes, you can have it both ways 2
Open/Closed Principle (OCP) Classes should be open to extension, but closed to modification Extension Composition of abstract types, not concrete classes Constructors and setters also take those abstract types Composer delegates to the composed Inheritance from those abstract classes and interfaces Modification Editing – allowed for fixing bugs, but not adding behavior Danger: propagation of changes to numerous dependents (subclasses, aggregators) Costly invalidation of test cases (have to rewrite) “Closure” is really creating openings for extension There is no “close” operation, but can use version control 3
OCP in Strategy _____Kia. Soul____ _ Tire tires_____ int tire. Size() bool tire. Perf() String tire. Season() <<interface>> _____Tire____ _ int size() bool perf() String season() _Michelin. Pilot_ … _Dunlop. SP_ … … Also, a constructor that initially sets tires field. Note that Kia. Soul delegates to Tire Open to infinity of tires without modification 4
OCP for Observer composes abstract type <− inherits abs. type Also, Display constructor that takes Subject, and Subject register method that takes Observer Subject delegates to the Observer Open to adding observers without modification 5
OCP for Decorator Inheritance from abstract types Composition of abstract types Decorator delegates to abstract superclass Open to addition of new drinks and condiments without modification to support all combinations 6
Does this diagram indicate OCP? A. Yes (and why? ) B. No (why not? ) 7
Discussion Best answer: A. Because Client composes an abstract interface, it can accept any implementation of Target. Thus, it is possible to add new Adapter/Adaptee pairs to the design without modifying any existing classes. Not B. Some people noted that Adapter, a concrete class refers to a concrete class. But that is not the part of the design we need “open”. I can always code new Adapter/Adaptee pairs, if necessary. 8
Factory Pattern: Motivation Correctly making objects is complex Especially making collection of related objects Parts of a car Look-and-feel of a window: canvas, scrollbar, etc. The correct making of objects is not easily centralized in one place Often do it all over code wherever object is needed Violates SRP and DRY DP angle is that “new” names and makes a concrete class; should be referring to abstract concrete class has to be named, but we can at least hide that from most of system encapsulating class will violate OCP, but no others will 9
Factory is the answer Actually a collection of patterns Simply factory (idiom) Factory Method Abstract Factory (not today) Concrete class; Mystery how to make one 10
2¢ Factory for Dating Events … static “Factory” methods keep Event details local 11
What’s wrong with 2¢ Factory? A. Doesn’t hide construction details adequately B. Should pass an enum argument rather than defining multiple methods: Event. make. Event(SEEMOVIE) C. Violates the Open/Closed principle D. “make” methods shouldn’t be static E. Name prefix should be “create”, not “make” 12
Simple Factory (idiom) How to make Events not necessarily part of Event 13
Comparison – increasingly abstract class My. Dating. Class { … Event event = new Event(2, “Order. Flowers”); // magic constants // concrete Event class (majorly violates OCP) Event event = Event. make. Order. Flowers(); // abstract class object (passed into constructor) Event event = factory. create. Event(FLOWERS); 14
Class Diagram for Simple Factory 15
What’s wrong with Simple Factory? A. create method has to know about all the concrete classes it new’s B. Client class composes concrete class C. Factory is a concrete class 16
Simple Factory is Good, but not OCP Simple. Event. Factory should implement Event. Factory interface Clients of SEF should then compose Event. Factory: class Date. Class { private Event. Factory factory; public Date. Class(Event. Factory factory) { this. factory = factory; } … Someone can implement a new class with Event. Factory interface, and Date. Class can use it with no modification Means that when Event. Factory is extended (new subclass), Date. Class is extended with new Event. Factory options. That’s open for extension! 17
Factory Method Style: Date as Factory ____Date____ create. Event() ____Youth____ create. Event() … ____Senior___ create. Event() Subclasses of Date are the factories! In this example, no parallel Date/Event class hierarchy Event hierarchy is “flat” – class hierarchy is implicit in data of Event What changes is time to first “flowers” event, what the flowers are, etc. 18
Factory Method Style: Separate Factory like SEF but in hierarchy with abstract super Super centralizes Event selector Subs implement making 19
Factory Motivation for Pizza Example: Franchising 20
Factory Method Class Diagram “composes” them all because their constructors are referenced 21
Object Relationships 22
- Slides: 22