工廠方法模式

工廠方法模式java

原文連接:https://blog.csdn.net/qq_42428264/article/details/90721656數據庫

原文很nice想了解更多,建議看看dom

1、工廠方法實現工具

1. 建立用於實現具體業務對象的接口測試

package com.test;

public interface Logger {
    public void writeLog();
}

2. 建立兩個業務對象,都實現Logger接口ui

2.1 數據日誌業務spa

package com.test;
//數據日誌
public class DatabaseLogger implements Logger {
    public void writeLog() {
        System.out.println("數據庫日誌記錄");
    }

2.2 文件日誌業務.net

package com.test;
public class FileLogger implements Logger {
    public void writeLog() {
        System.out.printin("文件日誌記錄");
    }
}

3. 建立實現業務工廠的接口或抽象類日誌

package com.test;

public interface LoggerFactory {
    public Logger createLogger(); // 抽象工廠方法
}

4. 建立兩個實現業務對象的工廠對象code

4.1 建立數據日誌業務對象的工廠類

package com.test;

public class DatabaseLoggerFactory implements LoggerFactory {
    public Logger createLogger(){
        //鏈接數據庫,代碼省略
        //建立數據庫日誌記錄器對象
        Logger logger= new DatabaseLogger();
        //初始化數據庫日誌記錄器,代碼省略
        return logger;
    }
}

4.2 建立文件日誌業務對象的工廠類

package com.test;

public class FileLoggerFactory implements LoggerFactory{
    public Logger createlogger() {
        // 建立文件日誌記錄器對象
        Logger logger= new FileLogger();
        //建立文件,代碼省略
        
        return logger;
    }
} 

5. 客戶測試類

package com.test;

public class Client {
    public static vold main(string []args){
        LoggerFactory factory;
        Logger logger;
        factory = new FileloggerFactory();//可引入配置文件和反射機制實現
        logger = factory.createlogger();
        logger.writeLog();
    }
}

2、工廠方法的缺點與優勢

缺點:

1. 增長了系統的複雜度,有更多的類須要編譯和運行,會給系統帶來一些額外的開銷。

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

優勢: 

1. 系統的可擴展性好,徹底符合開閉原則。

3、拓展

1. 客戶端隱藏工廠方法結構圖

2.經過config.xml配置文件調用日誌

XMLUtil工具類
package com.test;

import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class XMLUtil {
public static Object getBean() {
  DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
  DocumentBuilder builder = null;
  try {
    builder = factory.newDocumentBuilder();
    Document document = builder.parse("src/design/config.xml");
    // 獲取包含類名的文本節點
    NodeList list = document.getElementsByTagName("className");
    Node classNode = list.item(0).getFirstChild();
    String cName = classNode.getNodeValue().trim();
    Class c = Class.forName(cName);
    Object obj = c.newInstance();
    return obj;
  } catch (ParserConfigurationException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
  } catch (SAXException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
  } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
  }
  return null;
}

}
相關文章
相關標籤/搜索