题目
某软件公司欲开发一套界面皮肤库,可以对桌面软件进行界面美化。不同
的皮肤将提供视觉效果不同的按钮、文本框、组合框等界面元素,其结构如下图所示:
该皮肤库需要具备良好的灵活性和可扩展性,用户可以自由选择不同的皮
肤,开发人员可以在不修改既有代码的基础上增加新的皮肤。试使用抽象
工厂模式设计该皮肤库,绘制类图并编程模拟实现。
类图
编码实现
抽象工程类SkinFactory
package com.yuzhyun.test4.Abstract;
public interface SkinFactory {
Button getButton();
TextView gettTextView();
CheckBox getCheckBox();
}
抽象产品类Button(CheckBox、TextView 类似,就不贴代码了)
package com.yuzhyun.test4.Abstract;
public abstract class Button {
}
具体产品类BlueButton(BlueCheckBox、BlueTextView 类似)
package com.yuzhyun.test4.Concrete;
import com.yuzhyun.test4.Abstract.Button;
public class BlueButton extends Button {
public BlueButton() {
System.out.println("Generate A BlueButton");
}
}
具体工程类SummerFactory(SpringFactory类似)
package com.yuzhyun.test4.Concrete;
import com.yuzhyun.test4.Abstract.Button;
import com.yuzhyun.test4.Abstract.CheckBox;
import com.yuzhyun.test4.Abstract.SkinFactory;
import com.yuzhyun.test4.Abstract.TextView;
public class SummerFactory implements SkinFactory {
@Override
public Button getButton() {
return new BlueButton();
}
@Override
public TextView gettTextView() {
return new BlueTextView();
}
@Override
public CheckBox getCheckBox() {
return new BlueCheckBox();
}
}
客户类Client
package com.yuzhyun.test4;
import com.yuzhyun.test4.Abstract.Button;
import com.yuzhyun.test4.Abstract.CheckBox;
import com.yuzhyun.test4.Abstract.SkinFactory;
import com.yuzhyun.test4.Abstract.TextView;
import com.yuzhyun.util.XMLUtil;
public class Client {
public static void main(String[] args) {
Button button;
TextView textView;
CheckBox checkBox;
SkinFactory skinFactory=(SkinFactory) XMLUtil.getBean("configTest4.xml", "com.yuzhyun.test4.Concrete.");
button=skinFactory.getButton();
textView=skinFactory.gettTextView();
checkBox=skinFactory.getCheckBox();
}
}
配置文件读取类XMLUtil
package com.yuzhyun.util;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class XMLUtil {
public static Object getBean(String configFileName,String packageName) {
try {
DocumentBuilderFactory dFactory = DocumentBuilderFactory
.newInstance();
DocumentBuilder builder = dFactory.newDocumentBuilder();
Document document;
//配置文件放在项目的根目录下,不是放在src目录下
document=builder.parse(new File(configFileName));
//获取包含类名的节点
NodeList nodeList=document.getElementsByTagName("className");
Node node= nodeList.item(0).getFirstChild();
String cName=node.getNodeValue().trim();
//通过类名生成实例对象并将其返回
//如果没有包名,会报错java.lang.ClassNotFoundException:
Class class1=Class.forName(packageName+cName);
Object object=class1.newInstance();
return object;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
}
配置文件
<?xml version="1.0" encoding="UTF-8"?>
<config>
<className>SpringFactory</className>
</config>