ドアを作るには専門のドア職人にお願いしなければなりません。
しかしドア職人も万能ではありません。木製のドアしか作れない職人、鉄製のドアしか作れない職人と専門があります。
この際のオブジェクトをグループ化したいです。つまり、木製のドアは木製のドアしか作れない職人と一緒にする。鉄製のドアは鉄製が得意な職人と一緒にするといった感じです。ここで心配なことがあります。木製のドアに鉄製のドアが専門の職人を一緒にするといったことがありえそうです。
これを解決するのがabstract_factoryパターンです。複数のオブジェクトをまとめて作るファクトリーといった感じです。
class Door def getDescription end end class WoodenDoor < Door def getDescription puts "木のドアです。" end end class IronDoor < Door def getDescription puts "私は鉄のドアです。" end end class DoorFittingExpert def getDescription end end class Welder < DoorFittingExpert def getDescription puts "私が取り付けられるのは木製のドアだけです。" end end class Carpenter < DoorFittingExpert def getDescription puts "私が取り付けられるのは鉄製のドアだけです。" end end class DoorFactory def makeDoor end def makeFittingExpert end end class WoodenDoorFactory < DoorFactory def makeDoor WoodenDoor.new end def makeFittingExpert Welder.new end end class IronDoorFactory < DoorFactory def makeDoor IronDoor.new end def makeFittingExpert Carpenter.new end end wooden_door_factory = WoodenDoorFactory.new door = wooden_door_factory.makeDoor expert = wooden_door_factory.makeFittingExpert door.getDescription expert.getDescription iron_door_factory = IronDoorFactory.new door = iron_door_factory.makeDoor expert = iron_door_factory.makeFittingExpert door.getDescription expert.getDescription