iT邦幫忙

2022 iThome 鐵人賽

DAY 12
0
自我挑戰組

Ruby OOP to Oops !n 30系列 第 12

IT 邦鐵人賽 Day 12 - Factory Method

  • 分享至 

  • xImage
  •  

工廠方法模式(Factory Method)

目的:

定義可資生成物件的介面,但讓子類別去決定該具現出哪一種類別的物件。此模式讓類別將具現化程序交付給子類別去處置。

結構:

https://ithelp.ithome.com.tw/upload/images/20220927/20151094FEdeZeyE3k.png
先從單純的架構來說明工廠方法的使用

class Transportation

  def factory_method
    raise NotImplementedError, "#{self.class} has not implemented method '#{__method__}'"
  end

  def transport
    tool = factory_method

    result = "Transportation: The same creator's code has just worked with #{tool.operation}"

    result
  end
end

class LandTransport < Transportation
  def factory_method
    Truck.new
  end
end


class Tools
  def operation
    raise NotImplementedError, "#{self.class} has not implemented method '#{__method__}'"
  end
end

class Truck < Tools
  def operation
    '{Result of the Truck}'
  end
end


def client_code(creator)
  print "Client: I'm not aware of the creator's class, but it still works.\n"\
        "#{creator.transport}"
end

puts 'App: Launched with the LandTransport.'
client_code(LandTransport.new)

結果

App: Launched with the LandTransport.
Client: I'm not aware of the creator's class, but it still works.
Transportation: The same creator's code has just worked with {Result of the Truck}

流程

  1. 首先客戶端選擇指定的交通方式
  2. 再來就是使用transport方法,但因為LandTransport並不含此方法,經由繼承找到Transportation
  3. 此時的selfLandTransport.new
  4. 所以tool = factory_method實際樣子為tool = LandTransport.new.factory_method
  5. LandTransport類別內的factory_method會實體化Truck
  6. 最後用實體化的Truck呼叫operation,獲得結果

小結

首先工廠方法模式(Factory Method)產生物件,而產生物件的方法則為factory_method,在這裡的物件指的是Truck.new
其實這裡的概念用白話文解釋是,當我輸入陸運,就會得到貨車的交通工具。而這部分只是在說明為什麼稱之為**工廠方法模式(Factory Method)**而已,並還沒有展現優勢

更複雜些

如果今天要增設海運該怎麼解決這問題呢? 或許可以使用一個交通類別,去給各個運輸繼承。
但這會造成交通類別內需要寫入判斷式來決定該執行海運類別還是陸運類別,而我們之前討論過,若是判斷式出現時,應該要思考到增設介面才是。
而有幾個時機是適合使用工廠方法模式(Factory Method)

  1. 當類別無法明確指出欲生成物件類型時。 就像是我只能指定陸運,而不能直指貨車還獲得貨車實體
  2. 當類別希望讓子類別去指定欲生成物件類型時。 在這裡的陸運內部,就覆寫了factory_method而生成貨車實體
  3. 抽象類別匯集所有共通邏輯,但產生實體交由子類別執行。

... 待續


上一篇
IT 邦鐵人賽 Day 11 - Builder
下一篇
IT 邦鐵人賽 Day 13 - Prototype
系列文
Ruby OOP to Oops !n 3020
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
Jean_HSU
iT邦新手 5 級 ‧ 2022-09-28 23:19:47

歐魯喵喵叫~~~

我要留言

立即登入留言