2016-05-21 6 views
4

Ich verstehe, dass eine Factory-Methode eine Klassenmethode ist, die das self-Schlüsselwort verwendet und ein Objekt seiner eigenen Klasse instanziiert. Ich verstehe nicht, wie das sinnvoll ist oder wie es die Funktionalität der initialize Methode erweitern kann.Was ist eine Ruby Factory-Methode?

Ich arbeite an einem Projekt, das ein Befehlszeilenadressbuch erstellt, das mich auffordert, ein Factory-Muster für die Person-Klasse zu verwenden, damit ich einen Trainee oder einen Instruktor (Unterklassen) mit anderen Attributen erstellen kann.

+0

Um genau zu sein, 'self' ist keine Methode, es ist ein Schlüsselwort. – sawa

+1

Danke @sawa, machte die Bearbeitung –

+0

Übrigens: Ruby hat keine Konstruktoren. Die einzigen Möglichkeiten * neue Objekte zu erstellen sind 1) Literale und 2) Factory-Methoden. –

Antwort

5

Eine Factory-Klasse eine saubere Art und Weise ist eine einzige Factory-Methode zu haben, die verschiedenen Arten von Objekten erzeugt. Es dauert ein Parameter, ein Parameter, der der Methode sagt, welche Art von Objekt zu erstellen ist. Zum Beispiel ein Employee oder ein Boss, abhängig von dem Symbol zu erzeugen, die in übergeben wird:

class Person 
    def initialize(attributes) 
    end 
end 

class Boss 
    def initialize(attributes) 
    end 
end 

class Employee 
    def initialize(attributes) 
    end 
end 

class PersonFactory 
    TYPES = { 
    employee: Employee, 
    boss: Boss 
    } 

    def self.for(type, attributes) 
    (TYPES[type] || Person).new(attributes) 
    end 
end 

und dann:

employee = PersonFactory.for(:employee, name: 'Danny') 
boss = PersonFactory.for(:boss, name: 'Danny') 
person = PersonFactory.for(:foo, name: 'Danny') 

ich auch eine detailliertere Blog-Post zu diesem Thema geschrieben: The Factory Pattern

1

Das Factory Method Pattern erlaubt es Ihnen zumindest, einen aussagekräftigen Namen für etwas zu geben, was sonst ein komplizierter oder undurchsichtiger Konstruktor sein könnte. Wenn Sie beispielsweise einen Konstruktor haben, der eine Reihe von Parametern akzeptiert, ist möglicherweise nicht klar, warum der Aufrufer mit einer Factory-Methode oder Methoden die Komplexität der Objekterstellung verdecken und Ihren Code aussagekräftiger machen könnte geht weiter.

Also in Ihrem Fall ein schlechtes Design sein kann:

trainee = Person.new true

oder

instructor = Person.new false

Wo wahr oder falsch Zweige zu einem Lehrer oder Trainee zu schaffen.

Dies könnte durch die Verwendung einer Factory-Methode verbessert werden, um zu klären, was los ist:

trainee = Person.create_trainee 
instructor = Person.create_instructor 
+0

Wollen Sie damit sagen, dass der Hauptzweck der Factory-Methode nicht darin besteht, die Funktionalität des Objekterstellungsprozesses zu erweitern, sondern Ihren Code weniger kompliziert und lesbarer zu machen? –