Java特性之设计模式【抽象工厂模式】

news2024/11/26 4:40:25

一、抽象工厂模式

概述

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

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

抽象工厂模式提供了一种创建一系列相关或相互依赖对象的接口,而无需指定具体实现类。通过使用抽象工厂模式,可以将客户端与具体产品的创建过程解耦,使得客户端可以通过工厂接口来创建一族产品

主要解决:主要解决接口选择的问题

何时使用:我们明确地计划不同条件下创建不同实例时

优缺点

优点:

当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象

缺点:

产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码

1. 各个角色介绍

1.1抽象工厂(Abstract Factory)

声明了一组用于创建产品对象的方法,每个方法对应一种产品类型。抽象工厂可以是接口或抽象类

1.2 具体工厂(Concrete Factory)

实现了抽象工厂接口,负责创建具体产品对象的实例

1.3 抽象产品(Abstract Product)

定义了一组产品对象的共同接口或抽象类,描述了产品对象的公共方法

1.4 具体产品(Concrete Product)

实现了抽象产品接口,定义了具体产品的特定行为和属性

2. UML图

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

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

在这里插入图片描述

3. 具体例子和代码

角色分配

  • Shape:形状接口

    • Circle:圆形(实现形状接口)
    • Rectangle:三角形(实现形状接口)
    • Square:正方形(实现形状接口)
  • Color:形状接口

    • Red:圆形(实现形状接口)
    • Green:三角形(实现形状接口)
    • Blue:正方形(实现形状接口)
  • AbstractFactory:抽象工厂

3.1 形状接口以及实现类

  • Shape
package com.vinjcent.prototype.abstractFactory;

/**
 * @author vinjcent
 * @description 形状接口
 */
public interface Shape {

    /**
     * 绘图
     */
    void draw();

}
  • Circle
package com.vinjcent.prototype.abstractFactory;

/**
 * @author vinjcent
 * @description 实现形状接口-圆形
 */
public class Circle implements Shape {

   @Override
   public void draw() {
      System.out.println("Inside Circle::draw() method.");
   }

}
  • Rectangle
package com.vinjcent.prototype.abstractFactory;

/**
 * @author vinjcent
 * @description 实现形状接口-长方形
 */
public class Rectangle implements Shape {

    @Override
    public void draw() {
        System.out.println("Inside Rectangle::draw() method.");
    }

}
  • Square
package com.vinjcent.prototype.abstractFactory;

/**
 * @author vinjcent
 * @description 实现形状接口-正方形
 */
public class Square implements Shape {

   @Override
   public void draw() {
      System.out.println("Inside Square::draw() method.");
   }

}

3.2 颜色接口以及实现类

  • Color
package com.vinjcent.prototype.abstractFactory;

/**
 * @author vinjcent
 * @description 颜色接口
 */
public interface Color {

    /**
     * 颜色填充
     */
    void fill();

}
  • Red
package com.vinjcent.prototype.abstractFactory;

/**
 * @author vinjcent
 * @description 继承颜色接口-红色
 */
public class Red implements Color {

   @Override
   public void fill() {
      System.out.println("Inside Red::fill() method.");
   }

}
  • Green
package com.vinjcent.prototype.abstractFactory;

/**
 * @author vinjcent
 * @description 继承颜色接口-绿色
 */
public class Green implements Color {

    @Override
    public void fill() {
        System.out.println("Inside Green::fill() method.");
    }

}
  • Blue
package com.vinjcent.prototype.abstractFactory;

/**
 * @author vinjcent
 * @description 继承颜色接口-蓝色
 */
public class Blue implements Color {

   @Override
   public void fill() {
      System.out.println("Inside Blue::fill() method.");
   }

}

3.3 抽象工厂类以及实现类

  • AbstractFactory
package com.vinjcent.prototype.abstractFactory;

/**
 * @author vinjcent
 * @description 抽象工厂
 */
public abstract class AbstractFactory {

    /**
     * 构造颜色实体
     *
     * @param color 颜色名称
     * @return 颜色实体
     */
    public abstract Color getColor(String color);

    /**
     * 构造形状实体
     *
     * @param shape 形状名称
     * @return 形状实体
     */
    public abstract Shape getShape(String shape);

}
  • ColorFactory
package com.vinjcent.prototype.abstractFactory;

/**
 * @author vinjcent
 * @description 颜色工厂
 */
public class ColorFactory extends AbstractFactory {

    @Override
    public Shape getShape(String shapeType) {
        return null;
    }

    @Override
    public Color getColor(String color) {
        if (color == null) {
            return null;
        }
        if (color.equalsIgnoreCase("RED")) {
            return new Red();
        } else if (color.equalsIgnoreCase("GREEN")) {
            return new Green();
        } else if (color.equalsIgnoreCase("BLUE")) {
            return new Blue();
        }
        return null;
    }
}
  • ShapeFacotry
package com.vinjcent.prototype.abstractFactory;

/**
 * @author vinjcent
 * @description 形状工厂
 */
public class ShapeFactory extends AbstractFactory {

   @Override
   public Shape getShape(String shapeType) {
      if (shapeType == null) {
         return null;
      }
      // (优化:这里可以通过反射来获取)
      if (shapeType.equalsIgnoreCase("CIRCLE")) {
         return new Circle();
      } else if (shapeType.equalsIgnoreCase("RECTANGLE")) {
         return new Rectangle();
      } else if (shapeType.equalsIgnoreCase("SQUARE")) {
         return new Square();
      }
      return null;
   }

   @Override
   public Color getColor(String color) {
      return null;
   }
}

3.4 工厂生产者

  • FactoryProducer
package com.vinjcent.prototype.abstractFactory;

/**
 * @author vinjcent
 * @description 工厂生产者
 */
public class FactoryProducer {

    /**
     * 根据选择获取对应的生产工厂
     *
     * @param choice 选择类型
     * @return 具体的工厂
     */
    public static AbstractFactory getFactory(String choice) {
        if (choice.equalsIgnoreCase("SHAPE")) {
            return new ShapeFactory();
        } else if (choice.equalsIgnoreCase("COLOR")) {
            return new ColorFactory();
        }
        return null;
    }
}

3.5 测试主函数

package com.vinjcent.prototype.abstractFactory;

/**
 * @author vinjcent
 */
public class Main {

    public static void main(String[] args) {

        // 1.获取形状工厂
        AbstractFactory shapeFactory = FactoryProducer.getFactory("SHAPE");

        // 2.获取形状为 Circle 的对象
        Shape circle = shapeFactory.getShape("CIRCLE");
        // 2.1 调用 Circle 的 draw 方法
        circle.draw();

        // 3.获取形状为 Rectangle 的对象
        Shape rectangle = shapeFactory.getShape("RECTANGLE");
        // 3.1 调用 Rectangle 的 draw 方法
        rectangle.draw();

        // 4.获取形状为 Square 的对象
        Shape square = shapeFactory.getShape("SQUARE");
        // 4.1 调用 Square 的 draw 方法
        square.draw();

        // 5.获取颜色工厂
        AbstractFactory colorFactory = FactoryProducer.getFactory("COLOR");

        // 6.获取颜色为 Red 的对象
        Color red = colorFactory.getColor("RED");
        // 6.1 调用 Red 的 fill 方法
        red.fill();

        // 7.获取颜色为 Green 的对象
        Color green = colorFactory.getColor("GREEN");
        // 7.1调用 Green 的 fill 方法
        green.fill();

        // 8.获取颜色为 Blue 的对象
        Color blue = colorFactory.getColor("BLUE");
        // 8.1调用 Blue 的 fill 方法
        blue.fill();
    }
}

  • 测试结果

在这里插入图片描述

4. 使用场景

  • QQ 换皮肤,一整套一起换
  • 生成不同操作系统的程序

注意事项:

产品族难扩展,产品等级易扩展

在这里插入图片描述

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

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

相关文章

2001-2021年上市公司数字化转型(年报词频统计)

2001-2021年上市公司数字化转型(年报词频统计) 1、时间:2001-2021年 2、来源:上市公司年报、巨潮资讯网 3、方法说明:参考管理世界中吴非(2021)的做法,对人工智能技术、大数据技术…

警告:Provides transitive vulnerable dependency maven:org.yaml:snakeyaml:1.30

1. 警告 SpringBoot 的 validation 依赖包含有易受攻击的依赖 snakeyaml。 警告信息如下: Provides transitive vulnerable dependency maven:org.yaml:snakeyaml:1.30 意思是:提供了可传递的易受攻击依赖 maven:org.yaml:snakeyaml:1.30 2. 警告示例 …

networkX-03-连通度、全局网络效率、局部网络效率、聚类系数计算

文章目录 1.连通度1.1 检查图是否连通1.2 检查有向图是否为强连通1.3 点连通度、边连通度: 2.网络效率2.1全局效率2.2 局部效率2.2.1 查找子图2.2.3 局部效率源码分析 3.聚类系数(Clustering Coefficient)3.1 聚类系统源码分析 教程仓库地址&…

【开学作业考试层出不穷】Python自动答题脚本,在线答题,零基础可学!!(附源码)

前言 大家好 我是小曼呐~ 9月份想必大部分同学已经开学啦,开学少不了老师会布置一些 软件上面的作业 今天教大家用python制作自动答题脚本,100%准确率哦~ 喜欢的同学记得关注 收藏哦~ 环境使用 Python 3.8Pycharm 模块使用 import requests —>…

MySQL表的内连和外连

文章目录 MySQL表的内连和外连1. 内连接(1) 显示SMITH的名字和部门名称 2. 外连接2.1 左外连接(1) 查询所有学生的成绩,如果这个学生没有成绩,也要将学生的个人信息显示出来 2.2 右外连接(1) 对stu表和exam表联合查询,把所有的成绩都显示出来…

【Apollo学习笔记】——规划模块TASK之SPEED_BOUNDS_PRIORI_DECIDERSPEED_BOUNDS_FINAL_DECIDER

文章目录 前言SPEED_BOUNDS_PRIORI_DECIDER功能简介SPEED_BOUNDS_FINAL_DECIDER功能简介SPEED_BOUNDS_PRIORI_DECIDER相关配置SPEED_BOUNDS_FINAL_DECIDER相关配置SPEED_BOUNDS_DECIDER流程将障碍物映射到ST图中ComputeSTBoundary(PathDecision* path_decision)ComputeSTBounda…

MybatisPlus 快速入门 常见注解 配置

var code "81563903-534d-4850-9d6a-a9fb0318f593" 本课程全面讲解了Mybatis框架的使用,从快速入门到原理分析再到实战应用。每一个知识点都有案例进行演示学习,最终通过学习你将全面掌握,从而使Mybatis的开发更加的高效&#xff…

网络编程 day 6

1、基于UDP聊天室 服务器 #define ERR_MSG(msg) do{\fprintf(stderr,"__%d__",__LINE__);\perror(msg);\ }while(0) #define IP "127.0.0.1" #define PORT 6666 //创建链表 Linklistptr list_create(); Linklistptr node_buy(datatype e); int list_insert…

You must install at least one postgresql-client-<version> package

使用主机上的映射端口来连接到 PostgreSQL 数据库。例如,使用以下命令连接到数据库: psql -h localhost -p 5432 -U postgres出现下面的问题: 分析: 如果您在运行 psql 命令时遇到错误消息 You must install at least one pos…

flex布局轻而易举实现页面布局;超详细解析轻松掌握

我们曾如此渴望命运的波澜,到最后才发现,人生最曼妙的风景,竟是内心的淡定和从容。我们曾如此期盼外界的认可,到最后才知道,世界是自己的,与他人毫无关系。——杨绛 开始 痛点 网页布局(layout…

数据分析因子评分学习

当多个因素影响一个结果时,我们需要综合考虑这些因素分别对结果德影响。因子评分就是用于比较其对结果德影响程度。 文章目录 前言一、案例背景二、解决方案(一)分析思路(二)剔除无关数据(三)求…

role、user、schema在Oracle、MySQL、PostgreSQL的区别

0.先上结论 数据库逻辑可以细分为:角色、用户、数据库、模式PostgreSQL和MySQL合并了角色和用户,MySQL还合并了数据库、模式Oracle合并了用户、数据库、模式 1.图 1.1.架构 1.2.用户和角色 1.2.1.PostgreSQL 1.2.2.MySQL 1.2.3.Oracle 参考文章 数据…

安卓绘制原理概览

绘制原理 Android 程序员都知道 Android 的绘制流程分为 Measure、Layout、Draw 三步骤,其中 Measure 负责测量 View 的大小Layout 负责确定 View 的位置Draw 负责将 View 画在屏幕上 由 ViewRootImpl 实现的 performTraversal 方法是 Measure、layout、draw 的真正…

教育培训小程序的设计与功能解析

随着互联网的发展,线上教育逐渐成为一种趋势,越来越多的人开始选择在线学习。而搭建一个适合自己的线上教育小程序,可以为教育机构或个人提供更好的教学和学习体验。在本文中,我们将介绍如何通过一个第三方制作平台来搭建在线教育…

【Maven教程】(五)仓库:解析Maven仓库—布局、分类和配置,远程仓库的认证与部署,快照版本,依赖解析机制,镜像和搜索服务 ~

Maven 仓库 1️⃣ 什么是Maven仓库2️⃣ 仓库的布局3️⃣ 仓库的分类3.1 本地仓库3.2 远程仓库3.3 中央仓库3.4 私服 4️⃣ 远程仓库的配置4.1 远程仓库的认证4.2 部署至远程仓库 5️⃣ 快照版本6️⃣ 从仓库解析依赖的机制7️⃣ 镜像8️⃣ 仓库搜索服务8.1 Sonatype Nexus8.2…

大白菜清理电脑密码教程

首先安装大白菜: 插入u盘一键制作启动盘 制作成功,重启进入u盘启动模式

监控平台 - zabbix

目录 一、概述 二、搭建 一、概述 1. zabbix程序结构 zabbix-server:用于数据处理及写入到数据库 zabbix-agent:用于获取被监控端的性能检测数据 zabbix-web:用于数据的展示及远程操控 数据库:用于存储监控数据 zabbix-pr…

夜神模拟器进行APP抓包

夜神模拟器进行APP抓包 1、fiddler安装和配置1.1配置fiddler允许监听到https1.2配置fiddler允许远程连接1.3重启Fiddler(配置完成后需要重启才能生效) 2、安装夜神模拟器,并配置代理2.1打开模拟器wifi,修改网络代理2.2打开内置浏览…

基于深度学习网络的人员吸烟行为检测算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 clc; clear; close all; warning off; addpath(genpath(pwd)); rng(default)load FRCNN.mat I…

忧郁菇的介绍

前言 此文章为“植物大战僵尸”专栏中的第006刊(2023年9月五刊)。 无名版中有很多紫卡植物,分别是忧郁菇、玉米加农炮、猫尾草、机枪射手、地刺王、冰西瓜投手、双子向日葵、吸金菇。 提示: 1.用于无名版; 2.用于…