【五】、工廠方法模式

工廠方法模式

模式動機與定義
模式動機
【五】、工廠方法模式
模式定義
工廠方法模式(Factory Method Pattern)簡稱工廠模式,也叫虛擬構造器(Virtual Constructor)模式或者多態工廠(Polymorphic Factory)模式,它屬於類建立型模式。java

在工廠方法模式中,工廠父類負責定義建立產品對象的公共接口,而工廠子類則負責生成具體的產品對象,這樣作的目的是將產品類的實例化操做延遲到工廠子類中完成,即經過工廠子類來肯定究竟應該實例化哪個具體產品類。設計模式

模式結構與分析
模式結構
【五】、工廠方法模式
工廠方法模式包含以下角色:dom

Product:抽象產品ide

ConcreteProduct:具體產品工具

Factory:抽象工廠ui

ConcreteFactory:具體工廠設計

模式分析
工廠方法模式是簡單工廠模式的進一步抽象和推廣3d

工廠方法模式保持了簡單工廠模式的優勢,並克服了它的缺點code

核心的工廠類再也不負責全部產品的建立,而是將具體建立工做交給其子類去完成xml

能夠容許系統在不修改工廠角色的狀況下引進新產品

增長具體產品-->增長具體工廠,符合「開閉原則」

Java反射機制的應用
【五】、工廠方法模式

配置文件的應用
【五】、工廠方法模式

工具類XMLUtil代碼片斷

【五】、工廠方法模式
模式實例與解析
模式實例
電視機工廠:實例說明

將原有的電視機工廠進行分割,爲每種品牌的電視機提供一個子工廠,海爾工廠專門負責生產海爾電視機,海信工廠專門負責生產海信電視機,若是須要生產TCL電視機或創維電視機,只須要對應增長一個新的TCL工廠或創維工廠便可,原有的工廠無需作任何修改,使得整個系統具備更好的靈活性和可擴展性。

電視機工廠:參考類圖
【五】、工廠方法模式

電視機工廠:參考代碼

代碼結構:
【五】、工廠方法模式

TV接口

package factorymethod;

public interface TV {
    public void play();
}

HaierTV類

package factorymethod;

public class HaierTV implements TV {
    @Override
    public void play() {
        System.out.println("海爾電視機播放中···");
    }
}

HisenseTV類

package factorymethod;

public class HisenseTV implements TV {
    @Override
    public void play() {
        System.out.println("海信電視機播放中···");
    }
}

TVFactory接口

package factorymethod;

public interface TVFactory {
    public TV produceTV();
}

HaierTVFactory類

package factorymethod;

public class HaierTVFactory implements TVFactory {
    @Override
    public TV produceTV() {
        System.out.println("海爾電視機工廠生產海爾電視機!");
        return new HaierTV();
    }
}

HisenseTVFactory類

package factorymethod;

public class HisenseTVFactory implements TVFactory {
    @Override
    public TV produceTV() {
        System.out.println("海信電視機工廠生產海信電視機!");
        return new HisenseTV();
    }
}

FactoryMethodconfig.xml

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <className>factorymethod.HisenseTVFactory</className>

    <!--<className>factorymethod.HaierTVFactory</className>-->
</config>

XMLUtil類

package factorymethod;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;

public class XMLUtil {

    //該方法用於從XML配置文件中提取具體類類名,並返回一個實例對象
    public static Object getBean(){
        try {
            //建立文檔對象
            DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = dFactory.newDocumentBuilder();
            Document doc;

            doc = builder.parse(new File("D:\\MyNewWorld\\Study_JAVA\\MyHome\\Write_java\\My_Maven\\src\\main\\resources\\FactoryMethodconfig.xml"));

            //獲取包含類名的文本節點
            NodeList n1 = doc.getElementsByTagName("className");
            Node classNode = n1.item(0).getFirstChild();

            String cName = classNode.getNodeValue();

            //經過類名生成實例對象並將其返回
            Class c = Class.forName(cName);
            Object obj = c.newInstance();
            return obj;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

Client類

package factorymethod;

public class Client {
    public static void main(String[] args) {
        try {
            TV tv;
            TVFactory factory;
            factory = (TVFactory) XMLUtil.getBean();
            tv = factory.produceTV();
            tv.play();
        }catch (Exception e){
            System.out.println(e.getMessage());
        }
    }
}

運行結果
【五】、工廠方法模式
【五】、工廠方法模式
【五】、工廠方法模式
【五】、工廠方法模式

模式效果與應用
工廠方法模式優勢

工廠方法用來建立客戶所須要的產品,同時還向客戶隱藏了哪一種具體產品類將被實例化這一細節

可以讓工廠自主肯定建立何種產品對象,而如何建立這個對象的細節則徹底封裝在具體工廠內部。

在系統中加入新產品時,徹底符合開閉原則

工廠方法模式缺點

系統中類的個數將成對增長,在必定程度上增長了系統的複雜度,會給系統帶來一些額外的開銷。

增長了系統的抽象性和理解難度。

在如下狀況下可使用工廠方法模式:

客戶端不知道它所須要的對象的類(客戶端不須要知道具體產品類的類名,只須要知道所對應的工廠便可,具體產品對象由具體工廠類建立)

抽象工廠類經過其子類來指定建立哪一個對象

往期推薦
《【一】、設計模式概述》

《【二】、UML基礎知識》

《【三】、面向對象設計原則》

《【四】、簡單工廠模式》

相關文章
相關標籤/搜索