实验3:工厂方法模式
本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:
1、理解工厂方法模式的动机,掌握该模式的结构;
2、能够利用工厂方法模式解决实际问题。
[实验任务一]:加密算法
目前常用的加密算法有DES(Data Encryption Standard)和IDEA(International Data Encryption Algorithm)国际数据加密算法等,请用工厂方法实现加密算法系统。
实验要求:
1. 画出对应的类图;
2.
2.提交该系统的代码,该系统务必是一个可以能够直接使用的系统,查阅资料完成相应加密算法的实现;
Java——————————————————————————————————————
public class Client
{
public static void main(String args[])
{
try
{
Js js;
JsFactory factory;
factory=(JsFactory)XMLUtil.getBean();
js=factory.produceJs();
js.play();
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
}
}
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("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;
}
}
}
public interface Js
{
public void play();
}
public interface JsFactory
{
public Js produceJs();
}
public class DESFactory implements JsFactory
{
public Js produceJs()
{
System.out.println("DES");
return new DESJs();
}
}
public class IDEAFactory implements JsFactory
{
public Js produceJs()
{
System.out.println("IDEA");
return new IDEAJs();
}
}
public class DESJs implements Js
{
public void play()
{
System.out.println("DES加密中");
}
}
public class IDEAJs implements Js
{
public void play()
{
System.out.println("IDEA加密中");
}
}
C++——————————————————————————————————————
#include "tinyxml.h"
#include <iostream>
#include <string>
using namespace std;
TiXmlNode* XMLUtil(){
TiXmlNode* node=null;
TiXmlDocument doc;//申明一个文档类型变量,用来存储读取的xml文档
if (!doc.LoadFile("a.xml")) //检测xml文档是否存在
{
cerr << doc.ErrorDesc() << endl;
}
TiXmlElement* root = doc.FirstChildElement();//指向xml文档的根元素
if (root == NULL)//检测根元素存在性
{
cerr << "Failed to load file: No root element." << endl;
doc.Clear();
}
//elem指向根的第一个孩子元素
for (TiXmlElement* elem = root->FirstChildElement(); elem != NULL; elem = elem->NextSiblingElement()){
if (strcmp(elem->Value(), "className") == 0){ //也可以通过元素名寻找元素
node = elem->FirstChild();
cout << node->Value() << endl;
}
}
return node
}
public class Client
{
public DeFactory(String a)
{
Js js;
JsFactory factory;
factory=XMLUtil();
js=factory.produceJs();
js.play();
}
}
public interface Js
{
public void play();
}
public interface JsFactory
{
public Js produceJs();
}
public class DESFactory:public JsFactory
{
public Js produceJs()
{
Cout<<DES;
return new DESJs();
}
}
public class IDEAFactory :public JsFactory
{
public Js produceJs()
{
Cout<<IDEA;
return new IDEAJs();
}
}
public class DESJs :public Js
{
public void play()
{
Cout<<DES加密中;
}
}
public class IDEAJs :public Js
{
public void play()
{
Cout<<IDEA加密中;
}
}
3.注意编程规范。