抽象工厂模式设计实验

楚锋软件公司试图通过工厂方法模式设计界面皮肤库,但遇到类增多和配置复杂的问题。文章提出使用抽象工厂模式重构,减少类数量并简化用户配置,以提高系统灵活性和易用性。
摘要由CSDN通过智能技术生成

【实验内容】

楚锋软件公司欲开发一套界面皮肤库,可以对 Java 桌面软件进行界面美化。为了保护版权,该皮肤库源代码不打算公开,而只向用户提供已打包为 jar 文件的 class 字节码文件。用户在使用时可以通过菜单来选择皮肤,不同的皮肤将提供视觉效果不同的按钮、文本框、组合框等界面元素。其结构示意图如下图所示。

该皮肤库需要具备良好的灵活性和可扩展性,用户可以自由选择不同的皮肤,开发人员可以在不修改既有代码的基础上增加新的皮肤。

楚锋软件公司的开发人员针对上述要求,决定使用工厂方法模式进行系统的设计。为了保证系统的灵活性和可扩展性,提供一系列具体工厂来创建按钮、文本框、组合框等界面元素,客户端针对抽象工厂编程,初始结构如下图所示。

上图中的产品抽象类和具体产品类代码如下:

Button.java
public interface Button {
    public void display();    
}

SpringButton.java
public class SpringButton implements Button{
    public void display(){
        System.out.println("显示浅绿色按钮");
    }    
}

SummerButton.java
 public class SummerButton implements Button{
    public void display(){
        System.out.println("显示浅蓝色按钮");
    }    
}

ComboBox.java
public interface ComboBox {
    public void display();
}

SpringComboBox.java
 public class SpringComboBox implements ComboBox{
    public void display(){
        System.out.println("显示绿色边框组合框");
    }    
}

SummerComboBox.java
 public class SummerComboBox implements ComboBox{
    public void display(){
        System.out.println("显示蓝色边框组合框");
    }    
}

TextField.java
 public interface TextField {
    public void display();    
}

SpringTextField.java
 public class SpringTextField implements TextField{
    public void display(){
        System.out.println("显示绿色边框文本框");
    }    
}

SummerTextField.java
 public class SummerTextField implements TextField{
    public void display(){
        System.out.println("显示蓝色边框文本框");
    }    
}

在上述的设计中,提供了大量工厂来创建具体的界面组件,可以通过配置文件更换具体界面组件从而改变界面风格。但是,此设计方案存在以下问题:

(1)当需要增加新的皮肤时,虽然不需要修改现有代码,但是需要增加大量类,针对每一个新增具体组件都需要增加一个具体工厂,类的个数成对增加,这无疑会导致系统越来越庞大,从而增加了系统的维护成本和运行开销。

(2)由于同一种风格的具体界面组件通常要一起显示,因此需要为每个组件都选择一个具体工厂,用户在使用时必须逐个进行设置,如果某个具体工厂选择失误将会导致界面显示混乱,虽然可以适当增加一些约束语句,但客户端代码和配置文件都较为复杂。如何减少系统中类的个数并保证客户端每次始终只使用某一种风格的具体界面组件?这是楚锋软件公司开发人员所面临的两个问题。显然,工厂方法模式无法解决这两个问题。

【实验要求】

使用抽象工厂模式重构上面的设计。给出设计类图,以及对应的 Java 代码。

【实验答案参考】

UML设计类图:

Java代码:

SkinFactory.java
 public interface SkinFactory {
    public Button createButton();
    public TextField createTextField();
    public ComboBox createComboBox();
}

SpringSkinFactory.java
 public class SpringSkinFactory implements SkinFactory{
    public Button createButton(){
        return new SpringButton();
    }
    public TextField createTextField(){
        return new SpringTextField();
    }
    public ComboBox createComboBox(){
        return new SpringComboBox();
    }
}


SummerSkinFactory.java
 public class SummerSkinFactory implements SkinFactory{
    public Button createButton(){
        return new SummerButton();
    }
    public TextField createTextField(){
        return new SummerTextField();
    }
    public ComboBox createComboBox(){
        return new SummerComboBox();
    }
}


Client.java
public class Client {
    public static void main(String[] args) {
        SkinFactory factory;
        Button button;
        TextField textfield;
        ComboBox combobox;
        factory=new SpringSkinFactory();
        button=factory.createButton();
        textfield=factory.createTextField();
        combobox=factory.createComboBox();
        button.display();
        textfield.display();
        combobox.display();
    }
}

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值