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

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

maynowei5个月前 (09-29)技术知识114

原创:花括号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();
    }
}

总结

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

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

相关文章

分析 Rust 程序的火焰图(rust火吗)

分析 Rust 程序的火焰图(Flame Graph)是定位性能瓶颈的核心手段,其核心是通过可视化的函数调用栈和时间分布,找到 CPU 耗时、内存分配、锁竞争等热点。以下是详细的分析方法和步骤,结合...

Go 语言中的 RWMutex 源码解析、使用场景及应用分析

Go 语言标准库的 sync 包提供了一些非常重要的并发原语来帮助程序开发者处理并发任务。本文将详细解析 sync 包中的 RWMutex,即读写互斥锁(Reader/Writer Mutex),并结...

关于异步信号安全(下面关于异步电路危害的描述错误的是)

线程安全与重入以及异步信号安全的区别. 可重入一定是线程安全的,但是线程安全不一定是可重入的. 引用别人的博客中的话吧.如下: http://blog.csdn.net/xiaofei0859/art...

Go语言进阶:时间轮(golang时间轮)

时间轮概念时间轮(Timing Wheel)是一种高效的定时任务调度数据结构,特别适合处理大量定时任务。它通过一个循环数组(轮盘)和多个槽位(buckets)来组织定时任务,每个槽位代表一个时间间隔。...

6 张图带你彻底搞懂分布式事务 XA 模式

XA 协议是由 X/Open 组织提出的分布式事务处理规范,主要定义了事务管理器 TM 和局部资源管理器 RM 之间的接口。目前主流的数据库,比如 oracle、DB2 都是支持 XA 协议的。mys...

Oracle工具PLSQL登录时提示初始化失败,无法锁定OCI.dll错误解决

报错信息: (没有登录)-PL/SQL Developer Initialization error 无法锁定OCI dll OracleHomeKey: OracleHomeDir:E\instan...