工廠方法模式:
該模式有一個抽象基類和若干個派生的具體工廠類,基類定義了一個虛工廠方法返回指定產品類的基類,派生類需要實現該虛方法并創建具體產品類返回。注意工廠方法的每個具體工廠只負責返回一種產品類。
工廠和產品是一種一一對應的平行的關系.
GOF對工廠方法模式的概擴是:定義一個創建對象的接口,讓子類決定實例化哪一個類,使一個類的實例化沿遲到其子類中.
工廠方法的組成部份:
1.產品基類
2.具體產品
3.工廠基類
4.具體工廠基類
工廠方法組成部份之間的關系:

例子:
手機基類:
package methodFactory;

/**
* <ul>
* <li>Title:[Phone]</li>
* <li>Description: [手機抽象類]</li>
* <li>Copyright 2009 Upengs Co., Ltd.</li>
* <li>All right reserved.</li>
* <li>Created by [Huyvanpull] [2011-8-1]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
* @version 1.0
*/
public abstract class Phone
{
/** 手機型號 */
public String model;
/**
*<ul>
*<li>Description:[構造方法]</li>
*<ul>
* @param model
*/
public Phone(String model)
{
this.model = model;
}
/**
* <ul>
* <li>Description:[打電話]</li>
* <li>Created by [Huyvanpull] [2011-8-1]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
*/
public abstract void call();
/**
* <ul>
* <li>Description:[聽電話]</li>
* <li>Created by [Huyvanpull] [2011-8-1]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
*/
public abstract void answer();
/**
* <ul>
* <li>Description:[發信息]</li>
* <li>Created by [Huyvanpull] [2011-8-1]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
*/
public abstract void sendMsg();
/**
* <ul>
* <li>Description:[收信息]</li>
* <li>Created by [Huyvanpull] [2011-8-1]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
*/
public abstract void receiveMsg();
}

手機5233
package methodFactory;

/**
* <ul>
* <li>Title:[Nokia5233]</li>
* <li>Description: [諾基亞5233]</li>
* <li>Copyright 2009 Upengs Co., Ltd.</li>
* <li>All right reserved.</li>
* <li>Created by [Huyvanpull] [2011-8-1]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
* @version 1.0
*/
public class Nokia5233 extends Phone
{

public Nokia5233()
{
super("5233");
}

/* (non-Javadoc)
* @see simpleFactory.Phone#answer()
*/
public void answer()
{
System.out.println(this.model+"接聽電話");
}

/* (non-Javadoc)
* @see simpleFactory.Phone#call()
*/
public void call()
{
System.out.println(this.model+"打電話");
}

/* (non-Javadoc)
* @see simpleFactory.Phone#receiveMsg()
*/
public void receiveMsg()
{
System.out.println(this.model+"收短信");
}

/* (non-Javadoc)
* @see simpleFactory.Phone#sendMsg()
*/
public void sendMsg()
{
System.out.println(this.model+"發短信");
}
}

手機5235
package methodFactory;

/**
* <ul>
* <li>Title:[Nokia5235]</li>
* <li>Description: [諾基亞5235]</li>
* <li>Copyright 2009 Upengs Co., Ltd.</li>
* <li>All right reserved.</li>
* <li>Created by [Huyvanpull] [2011-8-1]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
* @version 1.0
*/
public class Nokia5235 extends Phone
{

public Nokia5235()
{
super("5235");
}

/* (non-Javadoc)
* @see simpleFactory.Phone#answer()
*/
public void answer()
{
System.out.println(this.model+"接聽電話");
}

/* (non-Javadoc)
* @see simpleFactory.Phone#call()
*/
public void call()
{
System.out.println(this.model+"打電話");
}

/* (non-Javadoc)
* @see simpleFactory.Phone#receiveMsg()
*/
public void receiveMsg()
{
System.out.println(this.model+"收短信");
}

/* (non-Javadoc)
* @see simpleFactory.Phone#sendMsg()
*/
public void sendMsg()
{
System.out.println(this.model+"發短信");
}
}

工廠基類
package methodFactory;

/**
* <ul>
* <li>Title:[PhoneFactory]</li>
* <li>Description: [手機工廠]</li>
* <li>Copyright 2009 Upengs Co., Ltd.</li>
* <li>All right reserved.</li>
* <li>Created by [Huyvanpull] [2011-8-1]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
* @version 1.0
*/
public abstract class PhoneFactory
{
/**
* <ul>
* <li>Description:[創建手機]</li>
* <li>Created by [Huyvanpull] [2011-8-1]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
* @return
*/
public abstract Phone createPhone();
}

5233工廠
package methodFactory;

/**
* <ul>
* <li>Title:[Nokia5233Factory]</li>
* <li>Description: [諾基亞5233工廠]</li>
* <li>Copyright 2009 Upengs Co., Ltd.</li>
* <li>All right reserved.</li>
* <li>Created by [Huyvanpull] [2011-8-1]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
* @version 1.0
*/
public class Nokia5233Factory extends PhoneFactory
{

/* (non-Javadoc)
* @see methodFactory.PhoneFactory#createPhone()
*/
public Phone createPhone()
{
return new Nokia5233();
}

}

5235工廠
package methodFactory;

public class Nokia5235Factory extends PhoneFactory
{

/* (non-Javadoc)
* @see methodFactory.PhoneFactory#createPhone()
*/
public Phone createPhone()
{
return new Nokia5235();
}
}

測試類
package methodFactory;

/**
* <ul>
* <li>Title:[測試類]</li>
* <li>Description: [type of functional description]</li>
* <li>Copyright 2009 Upengs Co., Ltd.</li>
* <li>All right reserved.</li>
* <li>Created by [Huyvanpull] [2011-8-1]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
* @version 1.0
*/
public class Test
{
/**
* <ul>
* <li>Description:[method of functional description]</li>
* <li>Created by [Huyvanpull] [2011-8-1]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
* @param args
*/
public static void main(String[] args)
{
Phone phone = new Nokia5233Factory().createPhone();
phone.call();
phone = new Nokia5235Factory().createPhone();
phone.receiveMsg();
}
}

優點:該模式有一個抽象基類和若干個派生的具體工廠類,基類定義了一個虛工廠方法返回指定產品類的基類,派生類需要實現該虛方法并創建具體產品類返回。注意工廠方法的每個具體工廠只負責返回一種產品類。
工廠和產品是一種一一對應的平行的關系.
GOF對工廠方法模式的概擴是:定義一個創建對象的接口,讓子類決定實例化哪一個類,使一個類的實例化沿遲到其子類中.
工廠方法的組成部份:
1.產品基類
2.具體產品
3.工廠基類
4.具體工廠基類
工廠方法組成部份之間的關系:

例子:
手機基類:


































































手機5233






















































手機5235






















































工廠基類


























5233工廠


























5235工廠














測試類




































使用工廠方法可以讓用戶的代碼和某一個特定類的了類的代碼解耦.
工廠方法使用戶不必知道它所使用的對象是如何被創建出來的,只需要知道該對象有哪些方法.