抽象工厂模式实例

本文通过一个软件公司的界面皮肤库开发案例,介绍了如何利用抽象工厂模式来实现灵活且可扩展的皮肤选择功能。文章详细说明了设计的类图,并展示了抽象工厂类、抽象产品类、具体产品类、具体工厂类、客户类以及配置文件读取类的编码实现,旨在确保用户能在不修改代码的情况下选择和增加新的皮肤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

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

类图

这里写图片描述

编码实现

抽象工程类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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值