Simple Factory 模式


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模式的重點,可將這個模式推至極緻,而成為一種通用、專門用來生成物件、建立依賴關係、甚至具備管理物件生命週期職責的輕量級容器。