- A Different Kind of Duck Typing
- The Template Method Strikes Again
- Parameterized Factory Methods
- Classes Are Just Objects, Too
- Bad News: Your Program Hits the Big Time
- Bundles of Object Creation
- Classes Are Just Objects (Again)
- Leveraging the Name
- Using and Abusing the Factory Patterns
- Factory Patterns in the Wild
- Wrapping Up
Classes Are Just Objects (Again)
One way to look at the abstract factory is to view it as a sort of super-duper-class object. While ordinary class objects know how to create only one type of object (i.e., instances of themselves), the abstract factory knows how to create several different types of objects (i.e., its products). This suggests a way to simplify our Abstract Factory pattern implementation: We can make it a bundle of class objects, with one class for each product. This is exactly the same “classes are just objects” insight that helped us simplify the Factory Method pattern.
The code below shows a class-based abstract factory. Instead of having several different abstract factory classes, one class for each set of things that the factory needs to produce, we can have just one factory class that stores the class objects of the things that it needs to produce:
class OrganismFactory def initialize(plant_class, animal_class) @plant_class = plant_class @animal_class = animal_class end def new_animal(name) @animal_class.new(name) end def new_plant(name) @plant_class.new(name) end end
With this class-based abstract factory, we can create a new instance of the factory for each compatible set of objects that we need:
jungle_organism_factory = OrganismFactory.new(Tree, Tiger) pond_organism_factory = OrganismFactory.new(WaterLily, Frog) jungle = Habitat.new(1, 4, jungle_organism_factory) jungle.simulate_one_day pond = Habitat.new( 2, 4, pond_organism_factory) pond.simulate_one_day
This all may seem a bit circular. After all, didn’t we originally create the abstract factory to avoid specifying the individual classes? And with our latest abstract factory implementation, aren’t we right back to being able to create a pond full of tigers or a jungle overrun by algae? Not really. The important thing about the abstract factory is that it encapsulates the knowledge of which product types go together. You can express that encapsulation with classes and subclasses, or you can get to it by storing the class objects as we did in the code above. Either way, you end up with an object that knows which kind of things belong together.