工厂方法模式包含如下角色:
Java反射机制的应用
配置文件的应用
工具类XMLUtil代码片段
电视机工厂:实例说明
电视机工厂:参考类图
电视机工厂:参考代码
代码结构:
TV接口
package factorymethod;
public interface TV {
public void play();
}
HaierTV类
package factorymethod;
public class HaierTV implements TV {
@Override
public void play() {
System.out.println("海尔电视机播放中···");
}
}
HisenseTV类
package factorymethod;
public class HisenseTV implements TV {
@Override
public void play() {
System.out.println("海信电视机播放中···");
}
}
TVFactory接口
package factorymethod;
public interface TVFactory {
public TV produceTV();
}
HaierTVFactory类
package factorymethod;
public class HaierTVFactory implements TVFactory {
@Override
public TV produceTV() {
System.out.println("海尔电视机工厂生产海尔电视机!");
return new HaierTV();
}
}
HisenseTVFactory类
package factorymethod;
public class HisenseTVFactory implements TVFactory {
@Override
public TV produceTV() {
System.out.println("海信电视机工厂生产海信电视机!");
return new HisenseTV();
}
}
FactoryMethodconfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<config>
<className>factorymethod.HisenseTVFactory</className>
<!--<className>factorymethod.HaierTVFactory</className>-->
</config>
XMLUtil类
package factorymethod;
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 {
//该方法用于从XML配置文件中提取具体类类名,并返回一个实例对象
public static Object getBean(){
try {
//创建文档对象
DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dFactory.newDocumentBuilder();
Document doc;
doc = builder.parse(new File("D:\\MyNewWorld\\Study_JAVA\\MyHome\\Write_java\\My_Maven\\src\\main\\resources\\FactoryMethodconfig.xml"));
//获取包含类名的文本节点
NodeList n1 = doc.getElementsByTagName("className");
Node classNode = n1.item(0).getFirstChild();
String cName = classNode.getNodeValue();
//通过类名生成实例对象并将其返回
Class c = Class.forName(cName);
Object obj = c.newInstance();
return obj;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
Client类
package factorymethod;
public class Client {
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(e.getMessage());
}
}
}
运行结果
工厂方法模式优点
工厂方法模式缺点
在以下情况下可以使用工厂方法模式: