创建型模式的目的就是使对象的创建和使用分离。
通过简单工厂方法模式的分析发现它依然存在着工厂类不符合设计原则的问题,于是就产生了工厂方法模式。它较之于简单工厂方法模式的区别是一个工厂不再生产多个产品,而是一个工厂生产一个产品。
public interface factory{
public abstract tv getTv();
}
class haierfactory implements factory{
public tv getTV(){
return new haier();
}
}
class haixinfactory implements factory{
public tv getTV(){
return new haixin();
}
}
class tclfactory implements factory{
public tv getTV(){
return new tcl();
}
}
class samsungfactory implements factory{
public tv getTV(){
return new sumsang();
}
}
public interface tv{
abstract void play();
}
class haier implements tv{
public void play(){
System.out.print("haier play");
};
}
class haixin implements tv{
public void play(){
System.out.print("haixin play");
};
}
class tcl implements tv{
public void play(){
System.out.print("tcl play");
};
}
class samsung implements tv{
public void play(){
System.out.print("samsung play");
};
}
public class watch{
public static void main(){
//首先要根据条件创建出具体的工厂的对象,但具体开发会使用反射机制
factory f = null;
if(...){f = new haierfactory();}
...
else if(...){f = new samsungfactory();}
f.getTv().play();
}
}
具体开发时,先在配置文件中配置想要的工厂类,另写一个工具类。
<?xml version="1.0"?>
<config>
<className>haierfactory</className>
</config>
public class XMLUtil{
public static Object getBean(){
//创建DOM文档对象
DocumentBuilderFactory dFactory =DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dFactory.newDocumentBuilder();
Document doc;
doc = builder.parse(new File("config.xml"));
//获取包含类名的文本节点
NodeList nl = doc.getElementsByTagName("className");
Node classNode=nl.item(0).getFirstChild();
String cName=classNode.getNodeValue();
/*通过类名生成实例对象并将其返回。
通过Class类的forName()方法返回与带有给定字符串名的类或接口相关联的Class对
象, 再通过newInstance()方法创建此对象所表示的类的一个新实例,即通过一个类
名字符串得到类的实例.
*/
Class c=Class.forName(cName);
Object obj=c.newInstance();
return obj;
}
}
public class watch{
public static void main(){
factory f = (factory)XMLUtil.getBean();
f.getTv().play();
}
}