The Abstract Factory Pattern
An object dedicated to creating a compatible set of objects is
called an abstract factory
class PondOrganismFactory
def new_animal ( name )
Frog . new ( name )
end
def new_plant ( name )
Algae . new ( name )
end
end
class JungleOrganismFactory
def new_animal ( name )
Tiger . new ( name )
end
def new_plant ( name )
Tree . new ( name )
end
end
class Habitat
def initialize ( number_animals , number_plants , organism_factory )
@organism_factory = organism_factory
@animals = [ ]
number_animals . times do |i |
animal = organism_factory . new_animal ( "Animal#{ i } " )
@animals << animal
end
@plants = [ ]
number_plants . times do |i |
plant = organism_factory . new_plant ( "Plant#{ i } " )
@plants << plant
end
end
end
jungle = Habitat . new ( 1 , 4 , JungleOrganismFactory . new )
jungle . simulate_one_day
pond = Habitat . new ( 2 , 4 , PondOrganismFactory . new )
pond . simulate_one_day
Store Class in instance variables
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
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
class IOFactory
def initialize ( format )
@reader_class = self . class . const_get ( "#{ format } Reader" )
@writer_class = self . class . const_get ( "#{ format } Writer" )
end
def new_reader
@reader_class . new
end
def new_writer
@writer_class . new
end
end
html_factory = IOFactory . new ( 'HTML' )
html_reader = html_factory . new_reader
pdf_factory = IOFactory . new ( 'PDF' )
pdf_writer = pdf_factory . new_writer