当前位置:首页 > 技术知识 > 正文内容

设计模式系列——抽象工厂模式_抽象工厂模式结构视图

maynowei8个月前 (09-29)技术知识148

原创:花括号MC(微信公众号:huakuohao-mc),欢迎分享,转载请保留出处。

抽象工厂提供了一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类型。简单来说是为需要创建多个相关联产品的场景提供了解决思路。

举个例子

很多软件都支持配置不同颜色的主题,当切换主题时,所有按钮样式和颜色都会统一切换。

假设我们的软件只有三类按钮,分别是Button, TextField,以及ComboBox,并且我们的软件只提供两类主题,即红色主题和绿色主题。

来看一下UML :

再来看一下具体代码如何实现。

先来创建一个SkinFactory接口

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

通过实现SkinFactory实现绿色主题工厂

//红色主题工厂
public class RedSkinFactory implements SkinFactory {

    @Override
    public Button createButton() {
        return new RedButton();
    }

    @Override
    public TextField createTextField() {
        return new RedTextField();
    }

    @Override
    public ComboBox createComboBox() {
        return new RedComboBox();
    }
}

红色主题工厂类类似,因为篇幅原因不再单独列出。

来看一下客户端如何使用

public class Client {
    public static void main(String[] args){
        //通过切换不同工厂,可以达到所有按钮颜色都变换的效果
        SkinFactory skinFactory = new RedSkinFactory();
        Button button = skinFactory.createButton();
        ComboBox comboBox = skinFactory.createComboBox();
        TextField textField = skinFactory.createTextField();

        button.display();
        comboBox.display();
        textField.display();
    }
}

总结

抽象工厂是创建模式之一,抽象工厂适合创建一系列有相关性的多个产品,虽然抽象工厂在扩展一个主题的按钮时灵活方便,但是也有一定缺点, 最大缺点就是想单独增加一个不属于任何主题的按钮时比较麻烦,比如上面的例子中,如果想增加一个关闭按钮,这个按钮即不属于红色主题也不属于绿主题,那么改动起来就比较复杂。

工厂模式三兄弟:简单工厂适合逻辑简单,创建产品数量很少的场景,工厂模式适合创建独立的产品,抽象工厂适合创建一系列有相关性的多个产品。

相关文章

在手机上演示axure原型(怎么在axure中画出手机原型)

AXSHARE APP发布啦,以后大家的原型可以通过这款APP进行预览演示咯。小编迫不及待的体验了一下这款APP。要使用这款APP,首先需要有axshare的账号。账号注册地址:https://sha...

CPU「离奇」飙到 100%!开发者挖出 Linux 内核 16 年老 Bug:这么多年竟无人发现?

【CSDN 编者按】每一次对旧设备的升级都仿佛是一场跨越时代的冒险。本文作者致力于将基于 PXA166 的 Chumby 8 设备从 Linux 2.6.28 版本升级到现代 6.x 版本,然而,在看...

btrace 3.0 重磅新增 iOS 支持!免插桩原理大揭秘!

重磅更新btrace 是由字节跳动抖音基础技术团队自主研发的面向移动端的性能数据采集工具,它能够高效的助力移动端应用采集性能 Trace 数据,深入剖析代码的运行状况,进而辅助优化提升移动端应用的性能...

Oracle又双叕开始严查JDK,连夜提桶跑路

哈佛商业报道了最近几起北美的JDK许可问题公司用了来源不明的JDK,怕蹲里面,连夜提桶跑路The company uses JDK from unknown sources, and is afrai...

Oracle数据库无法连接问题排查(oracle数据库连接不成功)

数据库告警日志 如下图 。发现 问题时间段,没有 数据库服务故障 报错,但是存在较多 TNS-12535 、 12560 、 12170 、 00505 错误:通过检查问题时间段应用日志, 也记录了...

面试官:说说Oracle数据库result cache的原理是什么?

概述前面已经用实验给大家介绍了Result Cache相关内容,今天主要讨论一下Oracle 11g Result Cache的深层原理。从参数看,Oracle提供了Client Result Cac...