Java工厂方法模式

TVFactory:

public abstract class TVFactory {
    public abstract TV produceTV();
}

TV:

public abstract class TV {
    public abstract void play();
}

HaierTV:

public class HaierTV extends TV{

    @Override
    public void play() {
        System.out.println("This is HaierTV play!");
    }
    
}

HisenseTV:

public class HisenseTV extends TV{

    @Override
    public void play() {
        System.out.println("This is HisenseTV play!");
    }
    
}

HaierTVFactory:

public class HaierTVFactory extends TVFactory{

    @Override
    public TV produceTV() {
        return new HaierTV();
    }
   
}

HisenseTVFactory:

public class HisenseTVFactory extends TVFactory{

    @Override
    public TV produceTV() {
        return new HisenseTV();
    }
    
}

FactoryMethod(Client):

public class FactoryMethond {

    public static void main(String[] args) {
        TVFactory tvf_1 = new HaierTVFactory();
        tvf_1.produceTV().play();
        TVFactory tvf_2 = new HisenseTVFactory();
        tvf_2.produceTV().play();
    }
    
}

Result:

This is HaierTV play!
This is HisenseTV play!

使用config.xml的方式调用。

注意:这里config.xml的路径。你需要在项目的根目录下创建一个专门放config.xml的文件,方便调用。我创建的是xmlFolder文件夹。(不创建文件夹直接创建xml文件放置在src中可能会出现找不到文件的错误。)

本人文件结构如下(IDE:Intellij IDEA):

在src中添加XMLUtil.java(注意该类中调用className的方式。即从NodeList到classNode.getNodeValue();结束):

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() {
        try {
            //创建文档对象
            DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = dFactory.newDocumentBuilder();
            Document doc;
            doc = builder.parse(new File("xmlFolder/config.xml"));

            //获取包含类名的文本节点
            NodeList nl = doc.getElementsByTagName("className");
            Node classNode = nl.item(1).getFirstChild();
            String cName = classNode.getNodeValue();

            //通过类名生成实例对象并将其返回
            Class c = Class.forName(cName);
            Object obj = c.newInstance();
            return obj;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

 config.xml:

<?xml version="1.0" encoding="utf-8" ?>

<config>
    <className>HaierTVFactory</className>
    <className>HisenseTVFactory</className>
</config>

FactoryMethod修改:

public class FactoryMethod {
    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("Error");
        }
    }
}

 结果:This is HisenseTV play!  

posted @ 2018-03-24 18:03  Polonium-210  阅读(133)  评论(0编辑  收藏  举报