面臨問題:
由于需求的變化,這個(gè)對對象的具體實(shí)現(xiàn)經(jīng)常需要?jiǎng)×易兓?但是它卻擁有著較穩(wěn)定的接口.
解決辦法:
如何應(yīng)對這種變化,需要提供一種"封裝機(jī)制"來隔離這種變化,從而保持系統(tǒng)中依賴該對象的對象隨著需求變化而變化.
簡單工廠模式:
嚴(yán)格說并不是一個(gè)設(shè)計(jì)模式。簡單工廠沒有抽象類,只有一個(gè)具體工廠類如MyFactory,然后MyFactory里面有個(gè)工廠方法CreateProduct返回一個(gè)基類產(chǎn)品,具體返回什么具體實(shí)例通過傳入?yún)?shù)然后用case判斷。
簡單工廠模式的組成部份:
1.產(chǎn)品基類
2.具體產(chǎn)品
3.產(chǎn)品工廠
簡單工廠各部份的組成關(guān)系

例子:
1. 手機(jī)基類
package simpleFactory;

/**
* <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ī)型號 */
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();
}
2. nokia5233
package simpleFactory;

/**
* <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ā)短信");
}
}

3. nokia5235
package simpleFactory;

/**
* <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ā)短信");
}
}

4.手機(jī)工廠
package simpleFactory;

/**
* <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 class PhoneFactory
{
/**
* <ul>
* <li>Description:[生產(chǎn)手機(jī)]</li>
* <li>Created by [Huyvanpull] [2011-8-1]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
* @param model
* @return
*/
public static Phone createPhone(String model)
{
if ("5233".endsWith(model))
{
return new Nokia5233();
}
else if ("5235".endsWith(model))
{
return new Nokia5235();
}
return null;
}
}

5.測試類
package simpleFactory;

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 = PhoneFactory.createPhone("5233");
phone.call();
phone = PhoneFactory.createPhone("5235");
phone.receiveMsg();
}
}

很明顯的缺點(diǎn)就是Nokia每發(fā)明一個(gè)新型號的手機(jī)都需要修改簡單工廠類(增加if判斷),違反了封閉修改,開放擴(kuò)展原則。
由于需求的變化,這個(gè)對對象的具體實(shí)現(xiàn)經(jīng)常需要?jiǎng)×易兓?但是它卻擁有著較穩(wěn)定的接口.
解決辦法:
如何應(yīng)對這種變化,需要提供一種"封裝機(jī)制"來隔離這種變化,從而保持系統(tǒng)中依賴該對象的對象隨著需求變化而變化.
簡單工廠模式:
嚴(yán)格說并不是一個(gè)設(shè)計(jì)模式。簡單工廠沒有抽象類,只有一個(gè)具體工廠類如MyFactory,然后MyFactory里面有個(gè)工廠方法CreateProduct返回一個(gè)基類產(chǎn)品,具體返回什么具體實(shí)例通過傳入?yún)?shù)然后用case判斷。
簡單工廠模式的組成部份:
1.產(chǎn)品基類
2.具體產(chǎn)品
3.產(chǎn)品工廠
簡單工廠各部份的組成關(guān)系

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


































































2. nokia5233






















































3. nokia5235






















































4.手機(jī)工廠






































5.測試類
























很明顯的缺點(diǎn)就是Nokia每發(fā)明一個(gè)新型號的手機(jī)都需要修改簡單工廠類(增加if判斷),違反了封閉修改,開放擴(kuò)展原則。