PS:一天一个设计模式复习,下了个怪怪的STARUML,类图有所区别,仅供自己温习把。
1.模式结构
工厂方法模式结构类图如图1.1所示(图中圆圈代表接口)
2.模式分析
工厂模式是简单工厂模式的进一步抽象和推广。在工厂模式中,核心的工厂类不再负责所有产品的创建,而是将具体的创建工作交给子类去做。例如现实生活中的手机工厂,华为生产华为手机,魅族生产魅族手机,那么抽象层的公司生产抽象的手机,具体的手机公司就生产具体品牌的手机。
3.实例解析
某手机厂专为各知名手机机品牌代工生产各种手机,当需要华为机时只需要调用该工厂的工厂方法时传入参数HuaWei,需要魅族时只需要传入参数MeiZu.
(1)抽象产品类phone
public interface phone {
public void open();
}
(2)具体产品类HuaWei,MeiZu
public class HuaWei implements phone{
@Override
public void open() {
System.out.println("华为手机开机中.....");
}
}
public class MeiZu implements phone{
@Override
public void open() {
System.out.println("华为手机开机中.....");
}
}
(3)抽象工厂类
public interface phoneFactory {
public phone producePhone();
}
(4)具体工厂类
public class HuaWeiFactory implements phoneFactory{
@Override
public phone producePhone() {
System.out.println("生产华为的手机");
return new HuaWei();
}
}
public class MeiZuFactory implements phoneFactory {
@Override
public phone producePhone() {
System.out.println("生产魅族的手机");
return new MeiZu();
}
}
(5)客户端测试类client
public class client {
public static void main(String args[]) throws Exception{
phone phone;
phoneFactory factory;
factory = (phoneFactory) XMLUtil.getBean();
phone = factory.producePhone();
phone.open();
}
}
(6)工具类–用于获取工厂实例对象
public class XMLUtil {
public static Object getBean() throws Exception{
//创建dom对象
DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dFactory.newDocumentBuilder();
Document doc = builder.parse("D:/config.xml");
//获取包含类名的文本节点
NodeList nl = doc.getElementsByTagName("className");
Node classNode = nl.item(0).getFirstChild();
String cname = classNode.getNodeValue();
/* String packageName = new ShapeFactory().getClass().getPackage().getName();
return (Shape) Class.forName(packageName + "." + className).newInstance(); 获取包名*/
//通过类名产生实例对象并返回
String packageName = "Factory_Model.";
cname = packageName + cname; //对反射研究不深,所以先用文本的方式 将包名和类名拼接,如果你创建的工程没有包名,可以省略
@SuppressWarnings("rawtypes")
Class c = Class.forName(cname);
Object obj = c.newInstance();
return obj;
}
}
(7)配置文件config.xml
<?xml version="1.0"?>
<config>
<className>HuaWeiFactory</className>
</config>