"Építő tervminta" "Ebben a példában autókat szeretnénk összeszereltetni, konkértan Porsche-t, Toyota-t és Ford-ot. A tervmintának megfelelőn van egy absztrakt építőnk, mely 3 különböző féle motort képes megépíteni. A minta Director szerepkörét itt a UI tölti be, ahol egy menü segítségével tudjuk megmondani, hogy az egyes autókat milyen motorral szereljék össze." Object subclass: #CarBuilder instanceVariableNames: 'car' classVariableNames: '' poolDictionaries: '' CarBuilder class>>new ^self basicNew initialize CarBuilder>>car "getter method" ^car CarBuilder>>car: aCar "setter method" car := aCar CarBuilder subclass: #FordBuilder instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' CarBuilder subclass: #ToyotaBuilder instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' CarBuilder subclass: #PorscheBuilder instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' FordBuilder>>initialize self car: FordCar new ToyotaBuilder>>initialize self car: ToyotaCar new PorscheBuilder>>initialize self car: PorscheCar new CarBuilder>>add4CylinderEngine "Do nothing. Subclasses will override." FordBuilder>>add4CylinderEngine self car addEngine: Ford4CylinderEngine new ToyotaBuilder>>add4CylinderEngine self car addEngine: Toyota4CylinderEngine new PorscheBuilder>>add4CylinderEngine self car addEngine: Porsche4CylinderEngine new CarBuilder>>addStandard6CylinderEngine "Do nothing. Subclasses will override." FordBuilder>>addStandard6CylinderEngine self car addEngine: FordStandard6CylinderEngine new ToyotaBuilder>>addStandard6CylinderEngine self car addEngine: ToyotaStandard6CylinderEngine new PorscheBuilder>>addStandard6CylinderEngine self car addEngine: PorscheStandard6CylinderEngine new ViewManager subclass: #CarAssemblerUI instanceVariableNames: 'builder' classVariableNames: '' poolDictionaries: '' CarAssemblerUI>>carMenu "Build the car-manufacturers menu." | menu | menu := Menu new title: 'Car'; owner: self. CarBuilder subclasses do: [:aClass | menu appendItem: aClass manufacturer "the label" selector: (Message "the action" receiver: self selector: #userChoseBuilder: arguments: (Array with: aClass))]. ^menu CarAssemblerUI>>userChoseBuilder: builderClass builder := builderClass new. CarBuilder class>>manufacturer self implementedBySubclass FordBuilder class>>manufacturer ^'Ford' ToyotaBuilder class>>manufacturer ^'Toyota' PorscheBuilder class>>manufacturer ^'Porsche' CarAssemblerUI>>engineMenu ^Menu new title: 'Engine'; owner: self; appendItem: '4-Cylinder' selector: #engineIs4Cylinder; appendItem: '6-Cylinder Standard' selector: #engineIsStandard6Cylinder; appendItem: '6-Cylinder Turbocharged' selector: #engineIsTurbocharged6Cylinder; yourself CarAssemblerUI>>engineIs4Cylinder "The user has selected the '4-cylinder' menu item from the 'Engine' pulldown menu. Tell my Builder." self builder add4CylinderEngine CarAssemblerUI>>engineIsStandard6Cylinder "The user has selected the 'Standard 6-cylinder' menu item from the 'Engine' pulldown menu." self builder addStandard6CylinderEngine CarAssemblerUI>>engineIsTurbocharged6Cylinder "The user has selected the 'Turbocharged 6-cylinder' menu item from the 'Engine' pulldown menu." self builder addTurbocharged6CylinderEngine CarAssemblerUI>>orderCar "The user has selected the 'Order' menu item, signaling all car/components selections have been made." | completeCar | "Get the assembled car from my Builder:" completeCar:= builder assembledCar. completeCar isNil ifTrue: [^MessageBox message: 'You haven''t finished assembling a complete car yet!']. "Assemble and print an invoice for the assembled car:" CarInvoiceMaker new printInvoiceFor: completeCar. CarBuilder>>assembledCar "Return my final Product after verifying there's a completed Product to return." car isNil ifTrue: [^nil]. car engine isNil ifTrue: [^nil]. ^car