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

news2025/6/19 20:26:14

抽象工厂模式

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

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

介绍

**意图:**提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

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

**何时使用:**系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。

**如何解决:**在一个产品族里面,定义多个产品。

**关键代码:**在一个工厂里聚合多个同类产品。

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

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

使用场景: 1、QQ 换皮肤,一整套一起换。 2、生成不同操作系统的程序。3、动态创建工厂生产产品

**注意事项:**产品族难扩展,产品等级易扩展。

示例实现

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

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

思路:

  1. 为具体工厂创建接口,用来生产具体产品
  2. 创建工厂类设置静态工厂方法,用来等待工厂实例化
  3. 创建抽象工厂,用来管理所有的工厂类
    在这里插入图片描述
    步骤 1
    为形状创建一个接口。
package AbstractFactory.Shapes;

public interface Shape {
    void draw();
}

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

package AbstractFactory.Shapes;

public class Rectangle implements Shape{
    @Override
    public void draw() {
        System.out.println("build Rectangle");
    }
}




public class Circle implements Shape{
    @Override
    public void draw() {
        System.out.println("build circle");
    }
}





public class Square implements Shape{
    @Override
    public void draw() {
        System.out.println("build Square");
    }
}

步骤 3
为颜色创建一个接口。

package AbstractFactory.Colors;

public interface Color {
    void fill();
}

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

package AbstractFactory.Colors;

public class Blue implements Color{
    @Override
    public void fill() {
        System.out.println("show Blue");
    }
}






public class Green implements Color{
    @Override
    public void fill() {
        System.out.println("show Green");
    }
}








public class Red implements Color{
    @Override
    public void fill() {
        System.out.println("show Red");
    }
}

步骤 5
为 Color 和 Shape 对象创建抽象类来获取工厂。

package AbstractFactory.Factory;

import AbstractFactory.Colors.Color;
import AbstractFactory.Shapes.Shape;

public abstract class AbstractFactory {
    public abstract Shape getShape(String shape);
    public abstract Color getColor(String color);
}

步骤 6
创建扩展了 AbstractFactory 的工厂类,基于给定的信息生成实体类的对象。

package AbstractFactory.Factory;

import AbstractFactory.Colors.Color;
import AbstractFactory.Shapes.Circle;
import AbstractFactory.Shapes.Rectangle;
import AbstractFactory.Shapes.Shape;
import AbstractFactory.Shapes.Square;
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;
   }
}








import AbstractFactory.Shapes.Shape;
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;
   }
}

步骤 7
创建一个工厂创造器/生成器类,通过传递形状或颜色信息来获取工厂。

package AbstractFactory.Factory;
public class FactoryProducer {
   public static AbstractFactory getFactory(String choice){
      if(choice.equalsIgnoreCase("SHAPE")){
         return new ShapeFactory();
      } else if(choice.equalsIgnoreCase("COLOR")){
         return new ColorFactory();
      }
      return null;
   }
}

步骤 8
使用 FactoryProducer 来获取 AbstractFactory,通过传递类型信息来获取实体类的对象。

package AbstractFactory.Factory;

import AbstractFactory.Colors.Color;
import AbstractFactory.Shapes.Shape;

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

        FactoryProducer.getFactory("color").getColor("red").fill();

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

        //获取形状为 Circle 的对象
        Shape shape1 = shapeFactory.getShape("CIRCLE");

        //调用 Circle 的 draw 方法
        shape1.draw();

        //获取形状为 Rectangle 的对象
        Shape shape2 = shapeFactory.getShape("RECTANGLE");

        //调用 Rectangle 的 draw 方法
        shape2.draw();

        //获取形状为 Square 的对象
        Shape shape3 = shapeFactory.getShape("SQUARE");

        //调用 Square 的 draw 方法
        shape3.draw();

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

        //获取颜色为 Red 的对象
        Color color1 = colorFactory.getColor("RED");

        //调用 Red 的 fill 方法
        color1.fill();

        //获取颜色为 Green 的对象
        Color color2 = colorFactory.getColor("GREEN");

        //调用 Green 的 fill 方法
        color2.fill();

        //获取颜色为 Blue 的对象
        Color color3 = colorFactory.getColor("BLUE");

        //调用 Blue 的 fill 方法
        color3.fill();
    }
}

步骤 9
执行程序,输出结果:

Inside Circle::draw() method.
Inside Rectangle::draw() method.
Inside Square::draw() method.
Inside Red::fill() method.
Inside Green::fill() method.
Inside Blue::fill() method.

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

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

相关文章

数据结构与算法六 树

一 二叉树入门 之前我们实现的符号表中,不难看出,符号表的增删查操作,随着元素个数N的增多,其耗时也是线性增多的,时间复杂度都是O(n),为了提高运算效率,接下来我们学习树这种数据结构。 1.1 树的基本定义…

流程引擎基础知识

流程引擎基础知识流程部署流程取消部署流程发起流程取回流程作废流程委托流程流转常用流程表介绍备注流程部署 1.后台直接导入bpmn /**流程部署源代码*/public void deploy() {ProcessEngine processEngine ProcessEngines.getDefaultProcessEngine();RepositoryService repo…

如何使用ChatGPT在1天内完成毕业论文

如何使用ChatGPT在1天内完成毕业论文 几天前,亲眼见证了到一位同学花了1天时间用ChatGPT完成了他的毕业论文,世道要变,要学会使用黑科技才能混的下去。废话到此结束,下面说明这么用AI生成自己的论文。 使用工具: 1. P…

Maven(一):什么是Maven?

Maven(一):什么是Maven?前言一、为什么要学习Maven?1、Maven 作为依赖管理工具1.1 jar 包的规模1.2 jar 包的来源1.3 jar 包之间的依赖关系2、Maven 作为构建管理工具2.1 你没有注意过的构建2.2 脱离 IDE 环境仍需构建…

【ERNIE Bot】百度 | 文心一言初体验

文章目录一、前言二、文心一言介绍三、申请体验⌈文心一言⌋四、⌈文心一言⌋初体验1️⃣聊天对话能力2️⃣文案创作能力3️⃣文字转语音能力✨4️⃣AI绘画能力✨5️⃣数理推理能力6️⃣代码生成能力7️⃣使用技巧说明五、总结一、前言 ​ 最近有关人工智能的热门话题冲上热榜…

亚马逊云科技十七年持续进化,解锁Amazon S3的七项新发布

17年前的3月14日,亚马逊云科技推出了一项“非常简单的”对象存储服务(Amazon Simple Storage Service)。该服务允许开发人员创建、列出和删除私有存储空间(称为存储桶)、上传和下载文件以及管理其访问权限。当时&#…

【C#+Unity小白】制作一款简单的2D平台游戏,PONG(弹球)游戏

素材均来自于Brackeys 各位可以到Youtube支持他,他的视频底下有他个人的网站,各位可以从他拿素材。 像我这样的菜鸡,在我看codeMonkey零零散散的制作视频而不知所措时,Brackeys出现了,他耐心教导,他真的是…

【2023最新】超详细图文保姆级教程:App开发新手入门(1)

1. 关于 『YonBuilder移动开发』 PS: 本段内容主要目的是去除官方语音描述,用通俗的语言来简单介绍一下『YonBuilder移动开发』,方便新手开发者判断是否适合自己上手学习。 简介: YonBuilder移动开发平台(官网:https://develope…

2023年14界蓝桥杯省赛“日期统计”题解

问题描述 小蓝现在有一个长度为 100 的数组,数组中的每个元素的值都在 0 到 9 的范围之内。数组中的元素从左至右如下所示: 5 6 8 6 9 1 6 1 2 4 9 1 9 8 2 3 6 4 7 7 5 9 5 0 3 8 7 5 8 1 5 8 6 1 8 3 0 3 7 9 2 7 0 5 8 8 5 7 0 9 9 1 9 4 4 6 8 6 3 …

Python 小型项目大全 41~45

四十一、幸运星 原文:http://inventwithpython.com/bigbookpython/project41.html 在这个碰运气游戏中,你掷骰子来收集星星。你掷得越多,你能得到的星星就越多,但是如果你得到三个头骨,你就失去了一切!这款…

【网络编程】UDP

✨个人主页:bit me👇 ✨当前专栏:Java EE初阶👇 目 录🏯一. UDP数据报套接字编程🏰二. 写一个 UDP 版本的 回显服务器-客户端.(echo server)🏭1. 服务器:&…

咖啡卷到现在,他们开始往里面掺北京豆汁了

咖啡卷到现在,他们开始往里面掺北京豆汁了0. 导读1. 人手一杯,果咖大势所趋2. 双倍成瘾:茶咖和酒咖被重点推荐3. 地方小吃融入咖啡,比如北京豆汁4. 炙手可热的云南咖啡豆5. 咖啡、户外和环保:绑定可持续6. 小结0. 导读…

vue - 【最新】简单快捷的 element ui 组件库的主题色更改,批量统一覆盖替换解决方法,无需npm装包。(适用于新手小白的方法,很简单)

效果图 最新解决方案,简单便捷且不用npm安装任何第三方包就能搞定。 原来的主题色是蓝色 ,可以通过本篇博客提供的方法,统一变成其他主题颜色,比如下面的紫色: 下面就是真实的运行效果,保证可行~ 这样就不用每个组件单独去写样式覆盖颜色了! 定制主

干雾抑尘系统的降尘工作原理

对于干雾抑尘系统,相信大家现在都不陌生,作为工业无组织排放粉尘治理的常用除尘产品,其有着传统喷雾降尘设备无法比拟的优势。今天我们就来了解下,干雾抑尘系统到底是什么?他的工作原理到底是怎样的呢? ​…

进程、线程、协程的区别

目录 1、什么是进程? 2、什么是线程? 3、什么是协程? 4、进程、线程、协程的区别 (1) 进程、线程的区别 (2) 线程、协程的区别 1、什么是进程? 简单来说,进程可以看做是加载到内存里的程序,实际上一…

Qt Quick - ColorDialog 颜色对话框

ColorDialog 颜色对话框使用总结一、概述二、实现的要点三、一些例子的合集1. 按钮点击修改按钮文字颜色一、概述 ColorDialog 就是Qt 提供的标准的颜色对话框。ColorDialog 允许用户选择颜色。 对话框最初是不可见的。你需要首先按需设置属性,然后将visible设置为…

前端 icon 方案该升级了

说到 icon,很多前端开发只能想到 iconfont,或者组件库中提供的那些图标,当然这对于绝大多数开发场景是够用的。 但要知道,iconfont 的方案其实是在 2016 年公开,到现在也已经有 6 年之久,它确实在这一段时…

【产品经理】为什么你画的流程图开发总说看不懂?

在做产品设计时,会碰到非常多的业务流程,当我们需要跟开发解释一个相对复杂的流程时,一个清晰的流程图,便非常重要了。 我们做产品设计的时候,会碰到非常多的业务流程,有简单的,有复杂的&#x…

「业务架构」需求工程——捕获与分析(第二部分)

从用户、客户和其他涉众那里生成系统需求的活动。可行性研究结束后,我们进入下一个阶段;抽取和分析。需求捕获和分析它是一个与客户和最终用户交互的过程,以查明领域需求、系统应该提供什么服务以及其他约束。领域需求反映了系统运行的环境,因…

HTML5 <del> 标签、HTML5 <dd> 标签

HTML5 <del> 标签 实例 一段带有已删除部分和新插入部分的文本&#xff1a; <p>My favorite color is <del>blue</del> <ins>red</ins>!</p> 尝试一下 浏览器支持 所有主流浏览器都支持 <del> 标签。 标签定义及使用说明 …