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

news2024/12/25 12:37:12

目录

1 介绍

2 优缺点

3 实现

1 介绍

抽象工厂模式(Abstract Factory Pattern) 是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显示指定它们的类。每个生成的工厂都能按照工厂模式提供对象。可以将抽象工厂模式理解为工厂模式的扩展。

2 优缺点

优点

  \bullet 抽象工厂模式隔离了具体类的生成,使得客户并不需要知道什么被创建。另外,应用抽象工厂模式可以实现高内聚低耦合的设计目的,因此抽象工厂模式得到了广泛使用。

  \bullet 增加新的具体工厂和实体类很方便,无须修改已有系统,符合“开闭原则”。

缺点:

  \bullet 增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对“开闭原则”的支持程序倾斜性。

  \bullet 增加了系统的抽象性和理解难度。

 

3 实现

我们将创建 Shape 和 Color 接口和实现这些接口的实体类。下一步是创建抽象工厂类 AbstractFactory。接着是定义工厂类 ShapeFactory 和 ColorFactory,这两个工厂类都是扩展了 AbstractFactory。然后创建一个工厂创造器/生成器类 FactoryProducer。

AbstractFactoryPatternDemo 类使用 FactoryProducer 来获取 AbstractFactory 对象。它将向 AbstractFactory 传递形状信息 Shape(CIRCLE/RECTANGLE/SQUARE),以便获取它所需对象的类型。同时它还向 AbstractFactory 传递颜色信息 Color(RED/GREEN/BLUE),以便获取它所需对象的类型。

步骤1:创建 Shape 形状接口

public interface Shape{
    void draw();
}

步骤2:创建实现 Shape 接口的实体类

public class Circle implements Shape{
    @override
    public void draw(){
        System.out.println("Circle");
    }
}
public class Rectangle implements Shape{
    @override
    public void draw(){
        System.out.println("Rectangle");
    }
}
public class Square implements Shape{
    @override
    public void draw(){
        System.out.println("Square"):
    }
}

 步骤3:创建 Color 接口

public interface Color{
    void fill();
}

 步骤4:创建实现 Color 接口的实体类

public class Red implements Color{
    @override
    public void fill(){
        System.out.println("Red"):
    }
}
public class Green implements Color{
    @override
    public void fill(){
        System.out.println("Green"):
    }
}
public class Blue implements Color{
    @override
    public void fill(){
        System.out.println("Blue"):
    }
}

 步骤5:创建抽象工厂 AbstractFactory 接口

public interface AbstractFactory{
    public abstract Shape getShape(String shapeType);
    public abstract Color getColor(String colorType);
}

 步骤6:创建实现 AbstractFactory 的 ShapeFactory 来获取具体的 Shape 实例(Rectangle/square/ circle)和 ColorFactory 来获取具体的 Color 实例(Red/Green/Blue)。

public class ShapeFactory implements AbstractFactory{
    @overrid
    public Shape getShape(String shapeType){
        if(shapeType == null)
            return nulll;
        } else {
            if(shapeType.equals("Rectangle"){
                return new Rectangle();
            }else if(shpeType.equals("Square"){
                return new Square();
            }else if(shapeType.equals("Circle"){
                return new Circle();
            }else {
                System.out.println("error");
                return null;
            }
        }
    }

    @override
    public Color getColor(String ColorType){
        return null;
    }
}
        
public class ColorFactory implements AbstractFactory{
    @overrid
    public Shape getColor(String colorType){
        if(colorType == null)
            return nulll;
        } else {
            if(colorType.equals("Red"){
                return new Red();
            }else if(colorType.equals("Green"){
                return new Green();
            }else if(colorType.equals("Blue"){
                return new Blue();
            }else {
                System.out.println("error");
                return null;
            }
        }
    }

    @override
    public Color getShape(String shapeType){
        return null;
    }
}

 步骤7:创建一个工厂生成器类 FactoryProducer,通过传递的信息来获取 ShapeFactory 或者 ColorFactory

public class FactoryProducer{
    public static AbstractFactory getFactory(String choice){
        if(choice == null){
            return null;
        }

        if(choice.equals("Shape"){
            return new ShapeFactory();
        else if(choice.equals("Color"){
            return new ColorFactory();
        }else {
            System.out.println("error");
            return null;
        }
    }
}

 步骤8:创建 AbstractFactoryPatternDemo 类,使用 FactoryProducer 来获取到具体的Factory (ShapeFactory/ColorFactory),然后再获取到Shape和 Color 的具体实现类。

public class AbstractFactoryPatternDemo{
    public static void main(String[] args){

        // 获取 ShapeFactory 工厂实例
        AbstractFactory shapeFactory = FactoryProducer.getFactory("Shape");

        //获取 Rectangle 实例,并调用 draw 方法
        Shape rectangle = shapeFactory.getShape("Rectangle");
        rectangle.draw();
        // 获取 Square 实例,并调用 draw 方法
        Shape square = shapeFactory.getShape("Square");
        square.draw();
        // 获取 circle 实例,并调用 draw 方法
        Shape circle = shapeFactory.getShape("Circle");
        circle.draw();

        // 获取 ColorFactory 工厂实例
        AbstractFactory colorFactory = FactoryProducer.getFactory("Color");

        //获取 Red 实例,并调用 draw 方法
        Color Red = colorFactory.getColor("Red");
        red.fill();
        // 获取 Green 实例,并调用 draw 方法
        Color Green = colorFactory.getColor("Green");
        Green.fill();
        // 获取 Blue 实例,并调用 draw 方法
        Color Blue = colorFactory.getColor("Blue");
        Blue.fill();

注意:抽象工厂模式当我们新增加一个类型,比如Course,我们只需要新增一个 CourseFactory 实现 AbstractFactory, 然后里面返回具体的实体类对象(Math/Chinese/English)即可,满足开闭原则。但是当我们需要向 Shape 或者 Color 里新增一个实体类,此时就要修改对应ShapeFactory 或者ColorFactory 里的代码,此时就不满足开闭原则

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ROC和AUC

目录 ROC AUC ROC ROC曲线是Receiver Operating Characteristic Curve的简称,中文名为"受试者工作特征曲线"。ROC曲线的横坐标为假阳性率(False Postive Rate, FPR);纵坐标为真阳性率(True Positive Rate, TPR).FPR和TPR的计算方法分别为 F…

Spring——案例-业务层接口执行效率和AOP通知获取数据+AOP总结

执行时间获取:记录开始时间和结束时间,取差值。 这里使用环绕通知来实现。 环境准备: 项目文件结构: 业务层接口和实现类: 数据层: 采用mybatis注解开发,这里没有实现类,直接在接口方法里面实现映射。 domain层: 实现了数据库里面每一个…

Altium designer--软件简介及安装教程(Altium designer16)

一、软件介绍(完整安装包资源见文末链接,含破解license) Altium Designer 是一款简单易用、原生3D设计增强的一体化设计环境,结合了原理图、ECAD库、规则和限制条件、BoM、供应链管理、ECO流程和世界一流的PCB设计工具。通过原理…

Baumer工业相机中曝光与增益两种功能的优点和作用以及使用方法

项目场景 Baumer工业相机堡盟相机是一种高性能、高质量的工业相机,可用于各种应用场景,如物体检测、计数和识别、运动分析和图像处理。 Baumer的万兆网相机拥有出色的图像处理性能,可以实时传输高分辨率图像。此外,该相机还具有…

[NOIP2009 提高组] 最优贸易(C++,tarjan,topo,DP)

题目描述 $C 国有国有国有 n 个大城市和个大城市和个大城市和 m$ 条道路,每条道路连接这 nnn个城市中的某两个城市。任意两个城市之间最多只有一条道路直接相连。这 mmm 条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双向通行的…

OpenHarmony通过MQTT连接 “改版后的华为IoT平台”

一、前言 本篇文章我们使用的是BearPi-HM_Nano开发板:小熊派的主板+E53_IA1扩展板 源码用的是D6_iot_cloud_oc,点击下载BearPi-HM_Nano全量源码 那么为什么要写这篇呢? 前段时间看到OpenHarmony群里,经常有小伙伴问接入华为IoT平台的问题,他们无法正常连接到华为IoT平台等…

【数据结构】二叉树相关OJ题

文章目录一、单值二叉树二、检查两颗树是否相同三、判断一棵树是否为另一颗树的子树四、对称二叉树五、二叉树的前序遍历六、二叉树中序遍历七、二叉树的后序遍历八、二叉树的构建及遍历一、单值二叉树 单值二叉树 题目描述 如果二叉树每个节点都具有相同的值,那…

【互联网架构】聊一聊所谓的“跨语言、跨平台“

文章目录序跨语言跨平台【饭后杂谈】为什么有人说Java的跨平台很鸡肋?序 很多技术都具有跨语言、跨平台的特点 比如JSON是跨语言的、Java是跨平台的、UniAPP、Electron是跨平台的 跨语言和跨平台,是比较重要的一个特性。这些特性经常能够决定开发者是否…

软件测试项目实战,一比一还原可以写进简历的

项目一:ShopNC商城 项目概况: ShopNC商城是一个电子商务B2C电商平台系统,功能强大,安全便捷。适合企业及个人快速构建个性化网上商城。 包含PCIOS客户端Adroid客户端微商城,系统PC后台是基于ThinkPHP MVC构架开发的跨…

ubuntu-22.04.2网络配置和root登录和root远程ssh登录

配置网络: 1.查看网卡名称 ip addr(ifconfig 无法使用,需要后期安装) 2. 配置静态IP (1)进入网络配置文件: vim /etc/netplan/00-installer-config.yaml (2)按一下 i ,进入插入模式&#…

网络 | 数据链路层讲解 | MAC帧与APR协议

最大以太网帧大小指的是以太网帧从目的地址到冗余校验的总字节数。在802.3标准里,规定了一个以太网帧的数据部分(Payload)的最大长度是1500个字节,这个数也是MTU。在这个限制之下,最长的以太网帧包括6字节的目的地址(DMAC)、6字节的源地址(SM…

【C++】list的模拟实现

文章目录1.list 底层2. list的模拟实现1. list_node 类设计2. list类如何调用类型3 .push_back(正常实现)4. 迭代器的实现第一个模板参数Tconst迭代器第二个模板参数Ref第三个模板参数Ptr对list封装的理解5. insert6.push_back与 push_front(复用)7. erase8. pop_back与pop_fro…

[c++]list模拟实现

目录 前言: 学习类的方式: 1 类成员变量 1.1 list成员变量 1.2 结点结构体变量 1.3 迭代器成员变量 2 默认函数——构造 2.1 结点结构体构造函数 2.2 list构造函数 2.3 迭代器构造函数 3 迭代器实现 3.1 list部分 3.2 迭代器结构体部分 3.2…

Spring MVC程序开发(三大功能)

文章目录一、什么是Spring MVC?1.MVC定义2.MVC与Spring MVC的关系3.创建方式二、Spring MVC的核心功能1.连接功能浏览器获取前端接口和后端程序连接功能实现get和post的区别Spring Boot热部署2.获取参数(1)传递单个参数(2)传递对…

信捷 XDH Ethercat A_MOVER指令

本指令以相对位置运动 如果当前位置在p点,执行本A_MOVER指令结束后,相对p点前移或后退一段距离,这个距离需要在指令里指定。每次执行A_MOVER都是执行前的当前位置为参考点,只要目标位置不为0,都会运动。上图中&#xf…

MyBatis-1:基础概念+环境配置

什么是MyBatis?MyBatis是一款优秀的持久层框架,支持自定义sql,存储过程以及高级映射。MyBatis就是可以让我们更加简单的实现程序和数据库之间进行交互的一个工具。可以让我们更加简单的操作和读取数据库的内容。MyBatis的官网:htt…

弱监督实例分割 Box-supervised Instance Segmentation with Level Set Evolution 论文笔记

弱监督实例分割 Box-supervised Instance Segmentation with Level Set Evolution 论文笔记一、Abstract二、引言三、相关工作3.1 基于 Box 的实例分割3.2 基于层级的分割四、提出的方法4.1 图像分割中的层级模型4.2 基于 Box 的实例分割在 Bounding Box 内的层级进化输入的数据…

elasticsearch 分布式搜索引擎3

1.数据聚合 **聚合(aggregations)**可以让我们极其方便的实现对数据的统计、分析、运算。例如: 什么品牌的手机最受欢迎?这些手机的平均价格、最高价格、最低价格?这些手机每月的销售情况如何? 实现这些…

Altium Designer(AD)软件使用记录04-AD设计文件输出汇总

目录Altium Designer(AD)软件使用记录04-AD设计文件输出汇总准备工作1、放置层标识(标清每个层的顺序)2、放置钻孔图(表明孔的一些参数)3、设置原点坐标一、文件输出1、Gerber文件(光绘文件)2、钻孔文件3、…

EasyExcell导出excel添加水印

EasyExcell导出excel添加水印1、添加easyExcel相关依赖2、准备基础工具类3、创建水印handler类4、创建单元测试类WriteTest.class5、测试结果1、添加easyExcel相关依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId&…