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!