设计模式详解---抽象工厂模式

继续前言,工厂模式中抽象工厂模式的讲解:

1. 前面的工厂模式有啥问题?

前面的工厂模式有这么个问题:一个产品就给了一个工厂,这样子如果产品变多,系统就会很复杂:

2. 解决方法

我们可以按照手机、电脑这两种分类来定义抽象出工厂,这样子避免了工厂子类越来越多、系统越来越复杂的问题,像这样把产品类按照一定的规则进行分组,组内不同产品对应于同一工厂类不同方法的设计模式,就是抽象工厂模式( Abstract Factory Pattern )

3. 代码设计

按照上述逻辑,我们就以手机为例,设计一下代码:

/**
 * @Author: stukk
 * @Description: 苹果的产品接口
 * @DateTime: 2023-12-15 12:03
 **/
public interface IphoneProduct {
    void showIphone();
}


/**
 * @Author: stukk
 * @Description: 苹果手机
 * @DateTime: 2023-12-15 12:07
 **/
public class Iphone implements IphoneProduct {

    @Override
    public void showIphone() {
        System.out.println("我是苹果手机");
    }
}

/**
 * @Author: stukk
 * @Description: 苹果电脑
 * @DateTime: 2023-12-15 12:07
 **/
public class Mac implements IphoneProduct {

    @Override
    public void showIphone() {
        System.out.println("我是苹果电脑");
    }
}



/**
 * @Author: stukk
 * @Description: 小米的产品接口
 * @DateTime: 2023-12-15 12:03
 **/
public interface MiProduct {
    void showMi();
}

/**
 * @Author: stukk
 * @Description: 小米手机产品
 * @DateTime: 2023-12-15 12:04
 **/
public class MiPhone implements MiProduct {
    @Override
    public void showMi() {
        System.out.println("我是小米手机....");
    }
}

/**
 * @Author: stukk
 * @Description: 小米电脑产品
 * @DateTime: 2023-12-15 12:04
 **/
public class MiComputer implements MiProduct {
    @Override
    public void showMi() {
        System.out.println("我是小米电脑....");
    }
}


/**
 * @Author: stukk
 * @Description: 工厂接口
 * @DateTime: 2023-12-15 12:09
 **/
public interface Factory {
//    创建苹果的产品
    IphoneProduct createIphone();
//    创建小米的产品
    MiProduct createMi();

}

 * @Author: stukk
 * @Description: 电脑工厂具体类
 * @DateTime: 2023-12-15 12:10
 **/
public class ComputerFactory implements Factory {

    @Override
    public IphoneProduct createIphone() {
        return new Mac();
    }

    @Override
    public MiProduct createMi() {
        return new MiComputer();
    }
}


/**
 * @Author: stukk
 * @Description: 手机工厂具体类
 * @DateTime: 2023-12-15 12:10
 **/
public class PhoneFactory implements Factory {

    @Override
    public IphoneProduct createIphone() {
        return new Iphone();
    }

    @Override
    public MiProduct createMi() {
        return new MiPhone();
    }
}


/**
 * @Author: stukk
 * @Description: 客户端
 * @DateTime: 2023-12-15 12:12
 **/
public class abstractFactoryExample {

    public static void main(String[] args) {
//        创建手机
        Factory factory = new PhoneFactory();
        IphoneProduct iphone = factory.createIphone();
        MiProduct mi = factory.createMi();
        iphone.showIphone();
        mi.showMi();
//        创建电脑
        factory = new ComputerFactory();
        IphoneProduct mac = factory.createIphone();
        MiProduct miComputer = factory.createMi();
        mac.showIphone();
        miComputer.showMi();
    }

}

4. 工厂模式的实际应用

工厂模式在实际开发中也有很多的应用场景:

  1. 依赖注入(Dependency Injection):工厂模式用于实现依赖注入,通过工厂类来创建和提供依赖的对象。这样可以实现松耦合的组件之间的依赖关系,方便进行单元测试和代码维护。

  2. 多态对象的创建:工厂模式可以根据条件或参数的不同创建不同的具体对象,实现多态的对象创建。这样可以根据具体需求动态地创建不同类型的对象,提供更大的灵活性和可扩展性。

  3. 插件系统:工厂模式可以用于实现插件系统,通过工厂类动态地加载和创建插件对象。这样可以方便地扩展应用的功能,允许用户根据需求选择和切换不同的插件实现。

  4. 数据库访问:工厂模式可以用于创建数据库访问对象,根据不同的数据库类型创建相应的数据库连接、查询执行器等对象。这样可以实现数据库访问的抽象和统一管理,提供更好的可维护性和扩展性。

 5.总结

普通工厂模式:

        普通工厂模式定义了唯一工厂类,通过用户传入的type参数,使用if-else来生成返回对应来创建对象。

工厂方法模式:

        工厂方法模式定义了给每个产品都定义了工厂类,用户可以直接调用对应的工厂类中的方法来创建对象,换句话说就是使用多态来解决这个if-else过多的问题

抽象工厂模式:

        抽象工厂模式把产品子类进行分组,同组中的不同产品由同一个工厂子类的不同方法负责创建,从而减少了工厂子类的数量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/247259.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端js实现将异步封装成promise然后用async await转同步

(一)需求背景: 哈喽 大家好啊,今天遇到一个问题,需要将异步请求转换成同步 (二)相关代码: function getInfo() {return new Promise((resolve,reject)> {setTimeout(()> {re…

vue_域名部署无法访问后端

前言 目前部署的比较另类,因为服务器为windows,目前还不是很会nginx,所以现在就只能在服务器上安装nodejs,然后直接使用npm run dev命令行的方式运行项目 遇到的坑 使用ip访问前端的时候,就可以访问,但是…

排序之归并排序

归并排序是第一个可以被实际使用的排序算法。归并排序性能不错,其复杂度为O(nlogn)。 归并排序是一种分治算法。其思想是将原始数组切分成较小的数组,直到每个小数组只有一 个位置,接着将小数组归并成较大的数组,直到最后只有一个…

获取Java类路径

利用System.getProperty(“java.class.path”)可以获取Java类路径(Java class path)。 package com.thb;import java.io.IOException;public class Test5 {public static void main(String[] args) throws IOException {System.out.println(System.getP…

pycharm在终端处删除连接过的服务器

目录 操作 操作 打开设置处的SSH配置进行删除

宝塔面板快速搭建本地网站结合内网穿透实现远程访问【无需公网IP】

文章目录 前言1. 环境安装2. 安装cpolar内网穿透3. 内网穿透4. 固定http地址5. 配置二级子域名6. 创建一个测试页面 前言 宝塔面板作为简单好用的服务器运维管理面板,它支持Linux/Windows系统,我们可用它来一键配置LAMP/LNMP环境、网站、数据库、FTP等&…

Python+Yolov8+onnx-deepsort方法物体人流量识别统计

程序示例精选 PythonYolov8onnx-deepsort方法物体人流量识别统计 如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助! 前言 这篇博客针对《PythonYolov8onnx-deepsort方法物体人流量识别统计》编写代码,…

【采坑分享】npm login/publish/whoami失败采坑,解决npmERR426、ETIMEDOUT、ECONNREFUSED等错误

目录 前言背景: 采坑之路: 1.修改https为http,问题还在 2.修改为淘宝镜像,问题还在 3.修改为官网地址,问题还在 4.升级node和npm,问题还在 5.猜想网络问题,问题解决 采坑总结&#xff1a…

【EI会议征稿】第三届计算机、人工智能与控制工程国际学术会议

The 3rd International Conference on Computer, Artificial Intelligence and Control Engineering (CAICE 2024) 第三届计算机、人工智能与控制工程国际学术会议 第三届计算机、人工智能与控制工程国际学术会议(CAICE 2024)将于2024年1月26-28日在西…

批量解压imagenet1k数据集中的zip文件

导言: 最近在处理imagenet1k数据集时,面对大量的zip包,手动一个一个解压显然不是明智的选择。作为程序员,我们可以采用批量解压的方法来提高效率,下面就是解决这一问题的方法和原因分析。 问题背景: image…

软件测试用例经典方法 | 单元测试法案例

单元测试又称模块测试,是对软件设计的最小单元的功能、性能、接口和设计约束等的正确性进行检验,检查程序在语法、格式和逻辑上的错误,并验证程序是否符合规范,以发现单元内部可能存在的各种缺陷。 单元测试的对象是软件设计的最…

ESXI 6.7升级update3

一、适用场景 1、企业已有专业服务器,通过虚拟化环境搭建了vm server; 2、备份整个vm server时,需要使用ovftool工具完成,直接导出ovf模板时报错; 3、升级EXSI6.7的build 8169922版本为update 3版本后,已保…

无脑利用API实现文心一言AI对话功能?(附代码)

前言:在当今数字化的时代,人工智能(AI)技术正在不断演进,为开发者提供了丰富的工具和资源。其中,API(应用程序接口)成为构建强大AI应用的关键组成部分之一。本文将介绍如何利用API来…

P21 卷积神经网络CNN

卷积 参数共享 Maxpool 逐步限制 neuron的弹性, 感受野限制看的范围,参数共享限制参数 由于上述限制,CNN的bias 比较大,用在图像中,影响不大。 如果用在其他方面,要注意一下。 pooling的目的是降低计算…

如何在手机上设置每年农历日期的生日提醒?

生日是一个比较特殊的节日,很多人都会在生日的时候,被自己的亲朋好友送祝福和礼物,同理我们也要在亲朋好友生日的时候,为他们送上祝福和礼物,这时候如果忘记对方的生日就比较影响关系了。而有不少小伙伴都表示自己平时…

基于深度学习yolov5钢材瑕疵目标检测系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介简介YOLOv5钢材瑕疵目标检测系统特性1. 数据预处理2. 模型架构3. 训练策略4. 后处理 性能评估 二、功能三、系统四. 总结 一项目简介 # YOLOv5 钢材瑕疵目标…

数据结构-07-二叉树

前面学习的栈、队列等等都是线性表结构。树是一种非线性表结构,比线性表的数据结构要复杂。 1-树tree “树”这种数据结构类似我们现实生活中的“树”,这里面每个元素我们叫作“节点”;用来连线相邻节点之间的关系,我们叫作“父子…

js 实现图片上传

<style>.showFile{width: 200px;height: 200px;border: 1px solid blue;}.showFile img{width: 100px;height: 100px;} </style> <div><input type"file" id"file" multiple><!--展示所上传的文件--><div class"sho…

2023年【上海市安全员B证】考试题库及上海市安全员B证考试资料

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 上海市安全员B证考试题库是安全生产模拟考试一点通总题库中生成的一套上海市安全员B证考试资料&#xff0c;安全生产模拟考试一点通上上海市安全员B证作业手机同步练习。2023年【上海市安全员B证】考试题库及上海市安…

数字孪生项目的开发平台

WEBGL 开发数字孪生项目的流程涵盖了需求分析、场景搭建、模型创建、数据接入、动画与交互、性能优化、测试与部署以及维护与升级等方面。WEBGL 开发数字孪生项目的流程可以分为以下几个步骤&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外…