|
Simple Factory模式又稱Static Factory模式。一個Simple
Factory生產成品,而對客戶端隱藏產品產生的細節,物件如何生成,生成前是否與其它物件建立依賴關係,客戶端皆不用理會,用以將物件生成方式之變化
與客戶端程式碼隔離。 假設今天,您要建立一個Message物件,這個Message物件會有一連串的物件實例化與依賴關係建立流程: Session session = someWhere.getSession(); Message msg = new MimeMessage(session); msg.setFrom(new InternetAddress(session.from)); msg.setSubject(session.subject); msg.setText(session.text); msg.setHeader(session.headerName, session.headerValue); msg.setDate(session.date); ... mailService.send(msg); 若這樣的流程是固定的,您可以將以上的細節封裝在一個類別中成為其靜態方法: public class MessageFactory { public static Message getMessage(Session session) { Message msg = new MimeMessage(session); msg.setFrom(new InternetAddress(session.from)); msg.setSubject(session.subject); msg.setText(session.text); msg.setHeader(session.headerName, session.headerValue); msg.setDate(session.date); ... return msg; } } 對使用MessageFactory的客戶端,可以這麼取得Message實例,而不用理會物件實例化與依賴關係建立的細節: Session session = someWhere.getSession(); Message message = MessageFactory.getMessage(session); mailService.send(message); Simple Factory 的類別圖如下所示: ![]() UML類別圖中,傳回型態Product意指的是具有Product所定義之公開協定(物件上的公開方法)的物件,而不是專指Java中的interface定義。以Python來說,以下也是個Simple Factory的實現: class Message: def __init__(self, addr, msg): self.addr = addr self.msg = msg def send(self): print("send message '%s' to '%s'" % (self.msg, self.addr)) class MessageFactory: def getMessage(addr, msg): message = Message(addr, msg) # 作一些有的沒的 return message msg = MessageFactory.getMessage("caterpillar@openhome.cc", "Hi") msg.send() Python的變數沒有型態,真正的型態資訊是在物件之上,就客戶端的角度而言,要確定的是傳回物件必然擁有send()公開方法。 Simple Factory使用靜態方法來簡單地隱藏物件建立細節。撇開靜態方法不談,隱藏物件建立的細節仍是Factory模式的重點,可將這個模式推至極緻,而成為一種通用、專門用來生成物件、建立依賴關係、甚至具備管理物件生命週期職責的輕量級容器。 |