面臨問題:
由于需求的變化,這個對對象的具體實現經常需要劇烈變化,但是它卻擁有著較穩定的接口.
解決辦法:
如何應對這種變化,需要提供一種"封裝機制"來隔離這種變化,從而保持系統中依賴該對象的對象隨著需求變化而變化.
簡單工廠模式:
嚴格說并不是一個設計模式。簡單工廠沒有抽象類,只有一個具體工廠類如MyFactory,然后MyFactory里面有個工廠方法CreateProduct返回一個基類產品,具體返回什么具體實例通過傳入參數然后用case判斷。
簡單工廠模式的組成部份:
1.產品基類
2.具體產品
3.產品工廠
簡單工廠各部份的組成關系

例子:
1. 手機基類
package simpleFactory;

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

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+"發短信");
}
}

4.手機工廠
package simpleFactory;

/**
* <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 class PhoneFactory
{
/**
* <ul>
* <li>Description:[生產手機]</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();
}
}

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

例子:
1. 手機基類


































































2. nokia5233






















































3. nokia5235






















































4.手機工廠






































5.測試類
























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