抽象工厂模式解决的问题:专门用来创建共存的对象组的对象叫做抽象工厂
工厂方法模式中最后一个代码示例中,如果Duck和WaterLily是不能共存的,那可以采用抽象工厂的解决方案
#代码示例
one = Pond.new(Duck, WaterLily)
one.simulate
抽象工厂代码示例
#消除子类
class Duck
def eat
puts "duck eat"
end
end
class Frog
def eat
puts "frog eat"
end
end
class WaterLily
def grow
puts "waterlily grow"
end
end
class Algae
def grow
puts "algae grow"
end
end
#是抽象工厂
class PondOrganismFactory
def new_animal
Frog.new
end
def new_plant
Algae.new
end
end
class Pond
def initialize(organism_factory)
@organism_factory = organism_factory
@animal = @organism_factory.new_animal
@plant = @organism_factory.new_plant
end
def simulate
@animal.eat
@plant.grow
end
end
one = Pond.new(PondOrganismFactory.new)
one.simulate
下面的代码对抽象工厂PondOrganismFactory进行优化,使得其可以自定义支持多种类
class Duck
def eat
puts "duck eat"
end
end
class Frog
def eat
puts "frog eat"
end
end
class WaterLily
def grow
puts "waterlily grow"
end
end
class Algae
def grow
puts "algae grow"
end
end
class OrganismFactory
def initialize(plant_class, animal_class)
@plant_class = plant_class
@animal_class = animal_class
end
def new_plant
@plant_class.new
end
def new_animal
@animal_class.new
end
end
class Pond
def initialize(organism_factory)
@organism_factory = organism_factory
@animal = @organism_factory.new_animal
@plant = @organism_factory.new_plant
end
def simulate
@animal.eat
@plant.grow
end
end
one = OrganismFactory.new(WaterLily, Frog)
two = Pond.new(one)
two.simulate