2011年3月30日 星期三

Gof Creational - Factory Method

Factory Method



[caption id="attachment_152" align="alignnone" width="600" caption="Factory Method"]Factory Method[/caption]




  • 意圖


提供一個標準共通產生物件實體的類別介面,將實作細節延遲至子類別實作時去決定物件該如何地被初始化,也就是說物件實體化是一定發生在子類別中的。


客戶端在使用factory method obj時,完全不需要知道實體類別是如何被產生的,反正他就只是依循介面來進行操作。




  • 優點





    1. 可以把跟業務邏輯/程式層面相依的class與建構過程中抽離,對於要產生實體物件時,就只是依循著操作Factory method obj介面來進行。

    2. 由於將初始化作業推遲進一個物件類別,所以也可透過子類別來額外設計另一種建構方法(方式),提供不同版本的建構功能。





  • 適合使用的情境





    1. 當無法預料出物件類別是否依定需要被建立。

    2. 寄望子類別可以指定有其特定的實體化方法。

    3. 物件類別在設計時,依責任腳色觀點設計提供了多種Helper classes時,我們希望可以將其腳色任務委派至不同的子類別進行操作。





  • J2EE / J2SE 使用的案例





    1. javax.ejb.EJBhome

    2. javax.ejb.EJBLocalHome

    3. javax.jms.QueueConnectionFactory

    4. javax.jms.TopicConnectionFactory

    5. java.text.Collator

    6. java.net.ContentHandlerFactory

    7. javax.naming.spi.InitialContextFactory

    8. 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();


}


 

沒有留言: