一、 实验目的与要求
1.练习使用工厂模式。设计相关的模拟场景并进行实施,验证模式特性,掌握其优缺点。
2.实验结束后,对相关内容进行总结。
二、实验内容
1.模式应用场景说明
作为一个青年人,最好的伙伴就是手机。而手机最重要的就是手机的CPU。两家公司Huawei和Apple要寻找一个代工厂。但是由于光刻机数量不足,因此,同一时间只允许有一种类型的CPU进行生产。可以修改外部配置文件,可以控制不同的CPU的生产。
2.应用场景类图
3.实现代码与解释
3.1抽象产品类
package 工厂模式;
public interface CPU {public void play();
}
3.2具体产品类HuaweiCPU
package 工厂模式;public class HuaweiCPU implements CPU {@Overridepublic void play() {System.out.println("Huawei的CPU生产中...");}
}
3.3具体产品类 AppleCPU
package 工厂模式;public class AppleCPU implements CPU {public void play() {System.out.println("Apple的CPU生产中...");}
}
3.4 抽象工厂类CPUFactory
package 工厂模式;public interface CPUFactory {public CPU produceCPU();
}
3.5具体工厂类HuaweiFactory
package 工厂模式;public class HuaweiFactory implements CPUFactory {public CPU produceCPU() {System.out.println("华为手机工厂生产华为CPU");return new HuaweiCPU();}
}
3.6具体工厂类AppleFactory
package 工厂模式;public class AppleFactory implements CPUFactory{public CPU produceCPU() {System.out.println("苹果手机工厂生产苹果CPU");return new AppleCPU();}
}
3.7辅助代码:获取外界配置文件的信息
package 工厂模式;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.xml.sax.SAXException;
import java.io.*;
public class XMLUtil
{
//该方法用于从XML配置文件中提取具体类类名,并返回一个实例对象public static Object getBean(){try{//创建文档对象DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = dFactory.newDocumentBuilder();Document doc; doc = builder.parse(new File("C:\\Users\\33132\\Desktop\\工厂模式\\工厂模式\\src\\工厂模式\\config.xml")); //获取包含类名的文本节点NodeList nl = doc.getElementsByTagName("className");Node classNode=nl.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;}}
}
3.8外界配置文件
4.结果及分析
4.1将配置文件节点改成AppleFactory
4.2将配置文件节点改成HuaweiFactory
三、实验总结
优点:可拓展性好,完全符合“开闭原则”。
缺点:由于考虑到系统的可拓展性,需要引入抽象层,增加了系统抽象性的理解难度。