抽象工厂模式解决的问题:专门用来创建共存的对象组的对象叫做抽象工厂

工厂方法模式中最后一个代码示例中,如果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

results matching ""

    No results matching ""