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!