抽象工厂模式实例

来源:互联网 发布:java 文件读取 编辑:程序博客网 时间:2024/05/16 15:49

题目

某软件公司欲开发一套界面皮肤库,可以对桌面软件进行界面美化。不同
的皮肤将提供视觉效果不同的按钮、文本框、组合框等界面元素,其结构如下图所示:
这里写图片描述
该皮肤库需要具备良好的灵活性和可扩展性,用户可以自由选择不同的皮
肤,开发人员可以在不修改既有代码的基础上增加新的皮肤。试使用抽象
工厂模式设计该皮肤库,绘制类图并编程模拟实现。

类图

这里写图片描述

编码实现

抽象工程类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>
0 0