工厂方法模式
在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给它的子类,而且每个具体产品都继承(实现)抽象的产品类,并且具体的工厂类和具体的产品两者是一一对应的。抽象工厂类和抽象产品类一般可以是接口(inteface)或抽象类(abstract).一般抽象工厂是抽象类,而抽象产品为接口。
一般工程都是用xml辅助,不用再修改源代码,所以本实例也是利用xml文档,并为该文件写一个工具类,代码如下
//XMLReadUtil.java
package com.designpatterns.factorymethodfactory;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class XMLReadUtil {
private static String filepath;
public static String getFilepath() {
return filepath;
}
public static void setFilepath(String filepath) {
XMLReadUtil.filepath = filepath;
}
public static Object getBean() throws Exception{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new File(getFilepath()));
Element element = document.getDocumentElement();
/*
NodeList list = element.getChildNodes();
for(int i=0;i<list.getLength();i++){
Node node = list.item(i);
if(node.getNodeName().equals("ClassName")){
String v =node.getNodeValue();
Class clazz = Class.forName(v);
Object obj =clazz.newInstance();
return obj;
}
}*/
NodeList list = element.getElementsByTagName("ClassName");
Node node =list.item(0).getFirstChild();
String v =node.getNodeValue();
Class clazz = Class.forName(v);
Object obj =clazz.newInstance();
return obj;
}
}
//xml文件
<?xml version="1.0" encoding="UTF-8"?>
<config>
<ClassName>com.designpatterns.factorymethodfactory.DataStructureBookFactory</ClassName>
</config>
java代码
//Book.java
package com.designpatterns.factorymethodfactory;
public interface Book {
public void type();
}
//DataStructure.java
package com.designpatterns.factorymethodfactory;
public class DataStructure implements Book {
public void type() {
System.out.println("this is a datastructure book");
}
}
//Math.java
package com.designpatterns.factorymethodfactory;
public class Math implements Book {
public void type() {
System.out.println("this is a mathmatic book");
}
}
//BookFactory.java
package com.designpatterns.factorymethodfactory;
public abstract class BookFactory {
public abstract Book sell();
}
//DataStructureBookFactory.java
package com.designpatterns.factorymethodfactory;
public class DataStructureBookFactory extends BookFactory {
public Book sell() {
return new DataStructure();
}
}
//MathBookFactory.java
package com.designpatterns.factorymethodfactory;
public class MathBookFactory extends BookFactory {
public Book sell() {
return new Math();
}
}
//test.java
package com.designpatterns.factorymethodfactory;
public class test {
public static void main(String[] args) {
try {
String filepath = "F:clazz.xml";
XMLReadUtil.setFilepath(filepath);
BookFactory factory = (BookFactory) XMLReadUtil.getBean();
Book book = factory.sell();
book.type();
} catch (Exception e) {
e.printStackTrace();
}
}
}