工廠方法模式-設計模式

工廠方法模式通過引入抽象工廠類的方式使得系統更加符合開閉原則,是對簡單工廠模式的優化。

下面我們用一個例子來模擬一下工廠方法模式

首先創建抽象工廠

package FactoryMethodPattern;

public interface LoggerFactory  {
    public Logger createLogger();
}

創建具體工廠類

package FactoryMethodPattern;

public class DatabaseLoggerFactory  implements LoggerFactory {
    @Override
    public Logger createLogger() {
        Logger logger = new DatabaseLogger();
        return logger;
    }
}
package FactoryMethodPattern;

public class FileLoggerFactory implements LoggerFactory {
    @Override
    public Logger createLogger() {
        Logger logger = new FileLogger();
        return logger;
    }
}

創建抽象產品類

package FactoryMethodPattern;

public interface Logger {
    public void write();
}

具體產品類

package FactoryMethodPattern;

public class DatabaseLogger implements Logger {
    public void write(){
        System.out.println("數據庫日志記錄...");
    }
}
package FactoryMethodPattern;

public class FileLogger implements Logger {
    @Override
    public void write() {
        System.out.println("文件記錄日志...");
    }
}

測試

package FactoryMethodPattern;

import SimpleFactoryPattern.XMLUtil;

public class Window {
    public static void main(String[] args) throws Exception {
        LoggerFactory factory;
           Logger logger;
//           LoggerFactory factory =  (LoggerFactory) XMlUtil.getBean();
//           factory = new FileLoggerFactory();
//           logger = factory.createLogger();
//           logger.write();
        factory = new DatabaseLoggerFactory();
        logger = factory.createLogger();
        logger.write();
    }
}

通過反射與配置文件獲取類對象

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

XML讀取

扫描二维码关注公众号,回复: 5677672 查看本文章
package FactoryMethodPattern;

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 {
    public static Object getBean() throws Exception{
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document document = db.parse(new File("src//FactoryMethodPattern//config.xml"));
        NodeList node = document.getElementsByTagName("className");
        Node node1=  node.item(0).getFirstChild();
        String className = node1.getNodeValue();
        Class c = Class.forName(className);
        Object o = c.newInstance();
        return o;
    }
}

測試

package FactoryMethodPattern;

import SimpleFactoryPattern.XMLUtil;

public class Window {
    public static void main(String[] args) throws Exception {
//        LoggerFactory factory;
           Logger logger;
           LoggerFactory factory =  (LoggerFactory) XMlUtil.getBean();
           factory = new FileLoggerFactory();
           logger = factory.createLogger();
           logger.write();
//        factory = new DatabaseLoggerFactory();
//        logger = factory.createLogger();
//        logger.write();
    }
}

結構圖

工廠方法模式總結:

優點:

1.在工廠方法中,用戶衹需要關注產品對應的工廠,而不需要關心創建的細節,不需要知道產品的類名。

2.所有的具體產品工廠都有共同的抽象父類,可實現多臺。

3.在添加新產品是無需修改抽象工廠,衹需要填加新的具體工廠和具體產品,符合開閉原則,系統可擴展性很好。

缺點:

1.在擴展時需要創建更多的類,增加系統的複雜度。

猜你喜欢

转载自blog.csdn.net/Bai_xing_yu/article/details/88837614
今日推荐