設計模式-工廠模式

PS:一天一個設計模式複習,下了個怪怪的STARUML,類圖有所區別,僅供自己溫習把。

1.模式結構

工廠方法模式結構類圖如圖1.1所示(圖中圓圈代表接口)
工廠模式類圖

2.模式分析

工廠模式是簡單工廠模式的進一步抽象和推廣。在工廠模式中,核心的工廠類不再負責所有產品的創建,而是將具體的創建工作交給子類去做。例如現實生活中的手機工廠,華爲生產華爲手機,魅族生產魅族手機,那麼抽象層的公司生產抽象的手機,具體的手機公司就生產具體品牌的手機。

3.實例解析

某手機廠專爲各知名手機機品牌代工生產各種手機,當需要華爲機時只需要調用該工廠的工廠方法時傳入參數HuaWei,需要魅族時只需要傳入參數MeiZu.
工廠模式類圖2
(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>

4.輸出結果

輸出結果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章