Factory Classes
Let’s return to the Payment class. It’s a very sad class,
completely empty and with next to no purpose; however, we can give it a
purpose by turning it into a factory class, utilizing another pattern in the famous Gang of Four Design Patterns
(Addison-Wesley) by Erich Gamma et al. and making our MTI solution even
more powerful and DRY.
A factory class is a class that has a constructor that returns instances of the correct subclass based on the inputs. Currently, if we have web forms with a radio selector for the payment type (Paypal, credit, or promotional), we’d have to write a case statement in every place we’re processing the input in order to create an instance of the correct type. Same goes for the credit card type (Visa, American Express, or MasterCard).
Instead, we can localize this logic in the Payment class itself. Any code that needs a
new payment object can pass in the appropriate information to the
factory method and out will come an object of the correct type.
In the following code, we define a constructor, new_payment, for the Payment class:
class Payment < ActiveRecord::Base
def self.new_payment(payment_type, credit_card_type)
case type
when 'paypal'
PaypalPayment.new
when 'promotional'
PromotionalPayment.new
when 'credit_card'
CreditCardPayment.new_payment credit_card_type
end
end
endNotice that if the payment is a credit card payment, we defer to a
constructor within the CreditCardPayment class. That constructor
might look like this:
class CreditCardPayment ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access