[caption id="attachment_152" align="alignnone" width="600" caption="Factory Method"]
- 意圖
提供一個標準共通產生物件實體的類別介面,將實作細節延遲至子類別實作時去決定物件該如何地被初始化,也就是說物件實體化是一定發生在子類別中的。
客戶端在使用factory method obj時,完全不需要知道實體類別是如何被產生的,反正他就只是依循介面來進行操作。
- 優點
- 可以把跟業務邏輯/程式層面相依的class與建構過程中抽離,對於要產生實體物件時,就只是依循著操作Factory method obj介面來進行。
- 由於將初始化作業推遲進一個物件類別,所以也可透過子類別來額外設計另一種建構方法(方式),提供不同版本的建構功能。
- 適合使用的情境
- 當無法預料出物件類別是否依定需要被建立。
- 寄望子類別可以指定有其特定的實體化方法。
- 物件類別在設計時,依責任腳色觀點設計提供了多種Helper classes時,我們希望可以將其腳色任務委派至不同的子類別進行操作。
- J2EE / J2SE 使用的案例
- javax.ejb.EJBhome
- javax.ejb.EJBLocalHome
- javax.jms.QueueConnectionFactory
- javax.jms.TopicConnectionFactory
- java.text.Collator
- java.net.ContentHandlerFactory
- javax.naming.spi.InitialContextFactory
- javax.net.SocketFactory
- 範例
package factoryMethod;
public interface Att3IF {
public void showXml();
}
package factoryMethod;
public class ConcreteAtt3 implements Att3IF {
@Override
public void showXml() {
// TODO Auto-generated method stub
System.out.println("i'm real concreate att3xml");
}
package factoryMethod;
public interface Att3Factory {
public Att3IF createAtt3();
}
package factoryMethod;
public class ConcreateAtt3Factory implements Att3Factory {
@Override
public Att3IF createAtt3() {
// TODO Auto-generated method stub
return new ConcreteAtt3();
}
}
// in Test.java
public static void main(String[] args) {
// TODO Auto-generated method stub
Att3Factory att3Fact = new ConcreateAtt3Factory();
Att3IF att3xml = att3Fact.createAtt3();
att3xml.showXml();
}
沒有留言:
張貼留言