抽象工厂模式实例

题目

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

类图

抽象工厂模式实例_第2张图片

编码实现

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

    }

}

配置文件


<config>
    <className>SpringFactoryclassName>
config>

你可能感兴趣的:(抽象工厂方法模式,设计模式)