工廠方法模式:
該模式有一個(gè)抽象基類和若干個(gè)派生的具體工廠類,基類定義了一個(gè)虛工廠方法返回指定產(chǎn)品類的基類,派生類需要實(shí)現(xiàn)該虛方法并創(chuàng)建具體產(chǎn)品類返回。注意工廠方法的每個(gè)具體工廠只負(fù)責(zé)返回一種產(chǎn)品類。
工廠和產(chǎn)品是一種一一對(duì)應(yīng)的平行的關(guān)系.
GOF對(duì)工廠方法模式的概擴(kuò)是:定義一個(gè)創(chuàng)建對(duì)象的接口,讓子類決定實(shí)例化哪一個(gè)類,使一個(gè)類的實(shí)例化沿遲到其子類中.
工廠方法的組成部份:
1.產(chǎn)品基類
2.具體產(chǎn)品
3.工廠基類
4.具體工廠基類
工廠方法組成部份之間的關(guān)系:

例子:
手機(jī)基類:
package methodFactory;

/**
* <ul>
* <li>Title:[Phone]</li>
* <li>Description: [手機(jī)抽象類]</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
{
/** 手機(jī)型號(hào) */
public String model;
/**
*<ul>
*<li>Description:[構(gòu)造方法]</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:[發(fā)信息]</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();
}

手機(jī)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+"發(fā)短信");
}
}

手機(jī)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+"發(fā)短信");
}
}

工廠基類
package methodFactory;

/**
* <ul>
* <li>Title:[PhoneFactory]</li>
* <li>Description: [手機(jī)工廠]</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:[創(chuàng)建手機(jī)]</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();
}
}

優(yōu)點(diǎn):該模式有一個(gè)抽象基類和若干個(gè)派生的具體工廠類,基類定義了一個(gè)虛工廠方法返回指定產(chǎn)品類的基類,派生類需要實(shí)現(xiàn)該虛方法并創(chuàng)建具體產(chǎn)品類返回。注意工廠方法的每個(gè)具體工廠只負(fù)責(zé)返回一種產(chǎn)品類。
工廠和產(chǎn)品是一種一一對(duì)應(yīng)的平行的關(guān)系.
GOF對(duì)工廠方法模式的概擴(kuò)是:定義一個(gè)創(chuàng)建對(duì)象的接口,讓子類決定實(shí)例化哪一個(gè)類,使一個(gè)類的實(shí)例化沿遲到其子類中.
工廠方法的組成部份:
1.產(chǎn)品基類
2.具體產(chǎn)品
3.工廠基類
4.具體工廠基類
工廠方法組成部份之間的關(guān)系:

例子:
手機(jī)基類:


































































手機(jī)5233






















































手機(jī)5235






















































工廠基類


























5233工廠


























5235工廠














測試類




































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