大话设计模式——7.抽象工厂模式(Abstract Factory Pattern)

1.介绍

抽象工厂模式是工厂模式的进一步优化,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。属于创建型模式。
UML图:
在这里插入图片描述

2.示例

车辆制造工厂,不仅可以制造轿车也可以用来生产自行车。
1)AbstractFactory:VehicleFactory

public interface VehicleFactory {

    /**
     * 建造自行车
     *
     * @return
     */
    Bike createBike();

    /**
     * 建造轿车
     *
     * @return
     */
    Car createCar();
}

2)AbstractProductA:Bike

public interface Bike {

    void bikeName();
}

3)AbstractProductB:Car

public interface Car {

    void carName();
}

4)ConcreteFactoryA:BMWVehicleFactory

public class BMWVehicleFactory implements VehicleFactory {

    @Override
    public Bike createBike() {
        return new BMWBike();
    }

    @Override
    public Car createCar() {
        return new BMWCar();
    }
}

5)ConcreteFactoryB:TeslaVehicleFactory

public class TeslaVehicleFactory implements VehicleFactory {

    @Override
    public Bike createBike() {
        return new TeslaBike();
    }

    @Override
    public Car createCar() {
        return new TeslaCar();
    }
}

6)ConcreteProductA1:BMWCar

public class BMWCar implements Car{

    @Override
    public void carName() {
        System.out.println("宝马 x5 四驱 燃油车");
    }
}

7)ConcreteProductA2:TeslaCar

public class TeslaCar implements Car {

    @Override
    public void carName() {
        System.out.println("特斯拉 modelY 四驱 电动车");
    }
}

8)ConcreteProductB1:BMWBike

public class BMWBike implements Bike{

    @Override
    public void bikeName() {
        System.out.println("宝马 碳纤维 大喇叭 二驱 自行车");
    }
}

9)ConcreteProductB2:TeslaCar

public class TeslaCar implements Car {

    @Override
    public void carName() {
        System.out.println("特斯拉 modelY 四驱 电动车");
    }
}

10)运行:
结合建议工厂模式:工厂生产者,可以再进行优化,通过反射的机制动态构建

public class VehicleFactoryProducer {


    /**
     * 超级工厂
     *
     * @param vehicleName
     * @return
     */
    public static VehicleFactory creatVehicleFactory(String vehicleName) {
        if ("BMW".equals(vehicleName)) {
            return new BMWVehicleFactory();
        } else if ("Tesla".equals(vehicleName)) {
            return new TeslaVehicleFactory();
        }

        return null;
    }
}

运行类

public class Main {

    public static void main(String[] args) {

        System.out.println("------BMW制造工厂-----");
        VehicleFactory bmwFactory = VehicleFactoryProducer.creatVehicleFactory("BMW");
        bmwFactory.createBike().bikeName();
        bmwFactory.createCar().carName();

        System.out.println("\n------Tesla制造工厂-----");
        VehicleFactory teslaFactory = VehicleFactoryProducer.creatVehicleFactory("Tesla");
        teslaFactory.createCar().carName();
        teslaFactory.createBike().bikeName();
    }
}

在这里插入图片描述

3.总结

1)优点:
a. 让具体的创建实例过程与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂实现分离,不会出现在客户代码中
b. 可以保证使用方始终只使用同一个产品族中的对象
c. 扩展容易,只需要增加新的产品类和对应的工厂类即可

2)缺点:
a. 不符合开闭原则,新增产品类时需要修改抽象工厂和抽象产品中的代码
b. 增加了系统的复杂性和抽象性

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

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

相关文章

基于Java+SpringBoot+vue+element实现校园闲置物品交易网站

基于JavaSpringBootvueelement实现校园闲置物品交易网站 博主介绍:多年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 ** 作者主页 央顺技术团队** 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式 文章目录 基于…

掘根宝典之C++普通迭代器和反向迭代器详解

简介 迭代器是一种用于遍历容器元素的对象。它提供了一种统一的访问方式,使程序员可以对容器中的元素进行逐个访问和操作,而不需要了解容器的内部实现细节。 C标准库里每个容器都定义了迭代器,这迭代器的名字就叫容器迭代器 迭代器的作用类…

10、MongoDB -- MongoDB 的 MongoTemplate 的功能和用法介绍

目录 MongoTemplate 的功能和用法演示前提:登录单机模式的 mongodb 服务器命令登录【test】数据库的 mongodb 客户端命令登录【admin】数据库的 mongodb 客户端命令 为 MongoDB 提供的两个 Starterspring-boot-starter-data-mongodb(为以同步方式操作 Mo…

Jmeter —— jmeter对图片验证码的处理!

jmeter对图片验证码的处理 在web端的登录接口经常会有图片验证码的输入,而且每次登录时图片验证码都是随机的;当通过jmeter做接口登录的时候要对图片验证码进行识别出图片中的字段,然后再登录接口中使用; 通过jmeter对图片验证码…

第N4周:中文文本分类-Pytorch实现

>- **🍨 本文为[🔗365天深度学习训练营](https://mp.weixin.qq.com/s/rbOOmire8OocQ90QM78DRA) 中的学习记录博客** >- **🍖 原作者:[K同学啊 | 接辅导、项目定制](https://mtyjkh.blog.csdn.net/)** # -*- coding: utf-8 -…

IDEA编译安卓源码TVBox(2)

一、项目结构:主要app和player app结构 二、增加遥控器按键选台 修改LivePlayActivity.java 1、声明变量 public String channelId "";public Timer timer new Timer();public Toast mToast;2、定义方法 private void mToastShow(String s){mToast …

攻防世界-misc-Make-similar

题目链接:攻防世界 (xctf.org.cn) 下载得到ogg文件。Olympic CTF 2014原题有提示120 LPM,对应Radiofax。需要将ogg格式文件转换成wav格式音频后,用OS X下的软件Multimode转换成单色传真图像: 文字部分为: section 1 of…

107. 如何使用Docker以及Docker Compose部署Go Web应用

文章目录 一、为什么需要Docker?二、Docker部署示例1. 准备代码2. 创建Docker镜像3. 编写Dockerfile4. Dockerfile解析5. 构建镜像6. 通过镜像创建容器运行 三、分阶段构建示例四、附带其他文件的部署示例五、关联其他容器六、Docker Compose模式七、总结 本文将介绍…

PlayBook 详解

4)Playbook 4.1)Playbook 介绍 PlayBook 与 ad-hoc 相比,是一种完全不同的运用 Ansible 的方式,类似与 Saltstack 的 state 状态文件。ad-hoc 无法持久使用,PlayBook 可以持久使用。 PlayBook 剧本是 由一个或多个 “…

5分钟上手Python爬虫:从干饭开始,轻松掌握技巧

很多人都听说过爬虫,我也不例外。曾看到别人编写的爬虫代码,虽然没有深入研究,但感觉非常强大。因此,今天我决定从零开始,花费仅5分钟学习入门爬虫技术,以后只需轻轻一爬就能查看所有感兴趣的网站内容。广告…

Docker 安装部署 ORACLE 11g数据库

Docker 安装部署 ORACLE 11g数据库 背景: ​ 最新在开发数据中台数据接入模块,其中设计很多数据类型,包括ORACLE ,因为是测试使用,想着快速部署测试,于是使用Docker 部署 Oracle , 生产环境不建议使用Doc…

【LeetCode热题100】160. 相交链表(链表)

一.题目要求 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null。 图示两个链表在节点 c1 开始相交: 题目数据 保证 整个链式结构中不存在环。 注意,函数…

鸿蒙Next学习-Flex布局

Entry Component struct FlexCase {build() {//需要在构造参数上传Flex({ direction: FlexDirection.Row,justifyContent:FlexAlign.Center }) {//flex布局Row().width(100).height(100).backgroundColor(Color.Red)Row().width(100).height(100).backgroundColor(Color.Yellow…

【ubuntu】安装 Anaconda3

目录 一、Anaconda 说明 二、操作记录 2.1 下载安装包 2.1.1 官网下载 2.1.2 镜像下载 2.2 安装 2.2.1 安装必要的依赖包 2.2.2 正式安装 shell 和 base 的切换 2.2.3 检测是否安装成功 方法一 方法二 方法三 2.3 其他 三、参考资料 3.1 安装资料 3.2 验证是否…

C语言函数—递归理解和练习

练习: 编写函数不允许创建临时变量,求字符串的长度。 我们看到这道题,第一个想到的是不是strlen int main() {char[] "bit";//[b][i][t][\0]//里面一共4个字符(包括结尾的、0)但是我们的strlen函数并不会计…

Navicat破解 Navicat下载安装 附教程 免费

百度网盘:https://pan.baidu.com/s/1wRRN_18_uXxPiIWCS4l43A 麻烦各位师傅帮忙填写一下问卷,提取码在问卷填写结束后显示~ 【https://www.wjx.cn/vm/mBBTTKm.aspx# 】 (资料来源于网络,侵告删)

‘sqlcmd‘不是内部或外部命令,也不是可运行的程序或批处理文件。

目录 一、问题 二、下载&安装sqlcmd 实用工具 三、验证 四、结果 一、问题 今天使用批处理文件执行SQLServer数据库的SQL语法时报错,提示sqlcmd不是内部或外部命令,也不是可运行的程序或批处理文件。,发生这个问题的原因是当前系统缺少…

程序员必备开发工具、程序员必备集成开发环境(IDE)

🌟 前言 欢迎来到我的技术小宇宙!🌌 这里不仅是我记录技术点滴的后花园,也是我分享学习心得和项目经验的乐园。📚 无论你是技术小白还是资深大牛,这里总有一些内容能触动你的好奇心。🔍 &#x…

大型政企寻求“智能化配方”,谁是“偏方”,谁是“验方”?

文 | 智能相对论 作者 | 叶远风 两会落幕,“人工智能”已成为国策,而全面推进智能化建设,大型政企首当其冲、责无旁贷——它们既是智能化转型升级的重要构成部分,也能直接在垂直领域形成价值引领、以点带片。 当智能成为大型政…

常用电路学习——开关机电路

开关机电路 最近在学习的时候,碰到了开关机电路,当时不懂R16的作用,一路磕磕碰碰,终于弄懂了,是上拉电阻,现在分享以下学习经验 。 软件开关机电路 IO1是单片机输出口,上电后默认输出1。 IO2…