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