PS:一天一個設計模式複習,下了個怪怪的STARUML,類圖有所區別,僅供自己溫習把。
1.模式結構
工廠方法模式結構類圖如圖1.1所示(圖中圓圈代表接口)
2.模式分析
工廠模式是簡單工廠模式的進一步抽象和推廣。在工廠模式中,核心的工廠類不再負責所有產品的創建,而是將具體的創建工作交給子類去做。例如現實生活中的手機工廠,華爲生產華爲手機,魅族生產魅族手機,那麼抽象層的公司生產抽象的手機,具體的手機公司就生產具體品牌的手機。
3.實例解析
某手機廠專爲各知名手機機品牌代工生產各種手機,當需要華爲機時只需要調用該工廠的工廠方法時傳入參數HuaWei,需要魅族時只需要傳入參數MeiZu.
(1)抽象產品類phone
public interface phone {
public void open();
}
(2)具體產品類HuaWei,MeiZu
public class HuaWei implements phone{
@Override
public void open() {
System.out.println("華爲手機開機中.....");
}
}
public class MeiZu implements phone{
@Override
public void open() {
System.out.println("華爲手機開機中.....");
}
}
(3)抽象工廠類
public interface phoneFactory {
public phone producePhone();
}
(4)具體工廠類
public class HuaWeiFactory implements phoneFactory{
@Override
public phone producePhone() {
System.out.println("生產華爲的手機");
return new HuaWei();
}
}
public class MeiZuFactory implements phoneFactory {
@Override
public phone producePhone() {
System.out.println("生產魅族的手機");
return new MeiZu();
}
}
(5)客戶端測試類client
public class client {
public static void main(String args[]) throws Exception{
phone phone;
phoneFactory factory;
factory = (phoneFactory) XMLUtil.getBean();
phone = factory.producePhone();
phone.open();
}
}
(6)工具類–用於獲取工廠實例對象
public class XMLUtil {
public static Object getBean() throws Exception{
//創建dom對象
DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dFactory.newDocumentBuilder();
Document doc = builder.parse("D:/config.xml");
//獲取包含類名的文本節點
NodeList nl = doc.getElementsByTagName("className");
Node classNode = nl.item(0).getFirstChild();
String cname = classNode.getNodeValue();
/* String packageName = new ShapeFactory().getClass().getPackage().getName();
return (Shape) Class.forName(packageName + "." + className).newInstance(); 獲取包名*/
//通過類名產生實例對象並返回
String packageName = "Factory_Model.";
cname = packageName + cname; //對反射研究不深,所以先用文本的方式 將包名和類名拼接,如果你創建的工程沒有包名,可以省略
@SuppressWarnings("rawtypes")
Class c = Class.forName(cname);
Object obj = c.newInstance();
return obj;
}
}
(7)配置文件config.xml
<?xml version="1.0"?>
<config>
<className>HuaWeiFactory</className>
</config>