浅谈抽象工厂模式

简介: 浅谈抽象工厂模式

🚗抽象工厂模式

定义

抽象工厂是指当有多个抽象角色时使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象。

角色

抽象产品

具体产品

抽象工厂

具体工厂

模式类图

🍓举个栗子

小米工厂生产小米手机和小米电脑

Vivo工厂生产Vivo手机和Vivo电脑

我们先假设下我们用工厂方法模式写的话,类图是什么呢?

🎈🎈🎈🎈🎈🎈🎈

那我们用工厂方法又是什么样的类图呢?

🎈🎈🎈🎈🎈🎈🎈

🎈:我们可以很明显的看出这个类比上面工厂方法的类少,这个也算是一个优点了

代码

🥛先来回顾下问题:

小米工厂生产小米手机和小米电脑

Vivo工厂生产Vivo手机和Vivo电脑

【Tpis】: 可以着重看下类图

编写顺序

Mobile > MiMobile > VivoMobile

Computer > MiComputer > VivoComputer

Factory > MiFactory > VivoFactory

Mobile.java

public interface Mobile {
    //打电话
    void call();
}

MiMobile.java

public class MiMobile implements Mobile {
    @Override
    public void call() {
        System.out.println("我的小米");
    }
}

VivoMobile.java

public class VivoMobile implements Mobile {
    @Override
    public void call() {
        System.out.println("我的vivo");
    }
}

Computer.java

public interface Computer {
    //工作
    void work();
}

MiComputer.java

public class MiComputer implements Computer {
    @Override
    public void work() {
        System.out.println("小米电脑");
    }
}

VivoComputer.java

public class VivoComputer implements Computer {
    @Override
    public void work() {
        System.out.println("vivo电脑");
    }
}

Factory.java

public interface Factory {
    Mobile getMobile();
    Computer getComputer();
}

MiFactory.java

public class MiFactory implements Factory {
    @Override
    public Mobile getMobile() {
        return new MiMobile();
    }
    @Override
    public Computer getComputer() {
        return new MiComputer();
    }
}

VivoFactory.java

public class VivoFactory implements Factory {
    @Override
    public Mobile getMobile() {
        return new VivoMobile();
    }
    @Override
    public Computer getComputer() {
        return new VivoComputer();
    }
}

Client.java

public class Client {
    private static void useProduct(Factory factory){
        factory.getComputer().work();
        factory.getMobile().call();
    }
    public static void main(String[] args) {
        useProduct(new VivoFactory());
        System.out.println("==============");
        useProduct(new MiFactory());
    }
}

结果

🧡模式优点

仍然有简单工厂和工厂方法的优点

抽象工厂把工厂类的数量减少了,无论有多少个产品等级,工厂就一套

💢模式缺点

当产品等级发生变化时,都要引起所有以前工厂代码的修改,比如我们要添加个 生产相机 ,那么Factory里面的代码就得改,那么所有的具体工厂都得改,违反了开闭原则

😋模式适用环境

当产品等级比较固定时,可以考虑用抽象工厂

若产品等级经常变化,则不建议使用抽象工厂


相关文章
|
存储 Ubuntu C语言
Ubuntu 软件安装方法(入门必看)
Ubuntu 软件安装方法(入门必看)
Ubuntu 软件安装方法(入门必看)
|
11月前
|
文字识别 数据可视化 项目管理
2024年知识管理软件评测:哪款工具最适合初创团队提升工作效率?
本文评测了8款适合初创企业的知识管理软件,包括板栗看板、Notion、Confluence、Evernote Business、Slack、Miro、Trello和Airtable。这些工具不仅支持高效的团队协作,还具备强大的信息管理功能,帮助企业在快速成长的过程中保持信息的有序和共享。初创企业可根据自身需求选择最适合的工具,提升团队效率。
 2024年知识管理软件评测:哪款工具最适合初创团队提升工作效率?
|
10月前
|
存储 缓存 Java
Spring面试必问:手写Spring IoC 循环依赖底层源码剖析
在Spring框架中,IoC(Inversion of Control,控制反转)是一个核心概念,它允许容器管理对象的生命周期和依赖关系。然而,在实际应用中,我们可能会遇到对象间的循环依赖问题。本文将深入探讨Spring如何解决IoC中的循环依赖问题,并通过手写源码的方式,让你对其底层原理有一个全新的认识。
219 2
网站维护更新简易单页404页html代码
一个简约风格的单页html页面,可用于网站维护中或更新网站时挂个首页使用,如果不喜欢现在的颜色请F12修改设置既可。
208 1
网站维护更新简易单页404页html代码
|
存储 Linux 应用服务中间件
RedHat红帽认证---RHCSA
RedHat红帽认证---RHCSA
535 0
|
存储 关系型数据库 分布式数据库
突破大表瓶颈|小鹏汽车使用PolarDB实现百亿级表高频更新和实时分析
PolarDB已经成为小鹏汽车应对TB级别大表标注、分析查询的"利器"。
突破大表瓶颈|小鹏汽车使用PolarDB实现百亿级表高频更新和实时分析
|
消息中间件 存储 RocketMQ
【RocketMQ系列十】RocketMQ的核心概念说明
【RocketMQ系列十】RocketMQ的核心概念说明
329 1
|
机器学习/深度学习 数据采集 人工智能
如何让大模型更聪明?
如何让大模型更聪明?
|
存储 缓存 Dubbo
http请求dubbo服务的最终解决方案(深度好文)
nodejs做http server代理,拆解dubbo原生协议,组装报文,采用socket通信交互。依赖原则:所有的rpc协议遵守着一个万变不离其宗的定律,调用方与服务提供方有一套约定的报文解析格式。
1694 0
http请求dubbo服务的最终解决方案(深度好文)
|
Cloud Native Java 编译器
Spring之提前编译:AOT
【1月更文挑战第18天】 一、AOT概述 1、JIT与AOT的区别 2、Graalvm 3、Native Image 二、演示Native Image构建过程 1、GraalVM安装 (1)下载GraalVM (2)配置环境变量 (3)安装native-image插件 2、安装C++的编译环境 (1)下载Visual Studio安装软件 (2)安装Visual Studio (3)添加Visual Studio环境变量 (4)打开工具,在工具中操作 3、编写代码,构建Native Image (1)编写Java代码 (2)复制文件到目录,执行编译 (3)Native Image 进行构建
285 2