【设计模式-04】Factory工厂模式

简要描述

  • 简单工厂
  • 静态工厂
  • 工厂方法 FactoryMethod
    • 产品维度扩展
  • 抽象工厂
    • 产品一族进行扩展
  • Spring IOC

一、工厂的定义

  • 任何可以产生对象的方法或类,都可以称之为工厂
  • 单例也是一种工厂
  • 不可咬文嚼字,死扣概念
  • 为什么有了new之后,还要有工厂?
    • 灵活控制生产过程
    • 权限、日志、修饰...

二、FactoryMethod 工厂方法

  • 任意定制交通工具
    • 继承Movable接口
  • 任意定制生产过程
    • Movable XXXFactory.create()
  • 任意定义产品一族

1、定义Movable接口

/**
 * @description: 可移动的交通工具接口
 * @author: flygo
 * @time: 2022/7/5 10:00
 */
public interface Movable {

  void go();
}

2、定义Car汽车对象

/**
 * @description: 汽车对象
 * @author: flygo
 * @time: 2022/7/5 10:00
 */
public class Car implements Movable {

  @Override
  public void go() {
    System.out.println("Car go...");
  }
}

3、定义Plane飞机对象

/**
 * @description: 飞机对象
 * @author: flygo
 * @time: 2022/7/5 10:01
 */
public class Plane implements Movable {

  @Override
  public void go() {
    System.out.println("plane go...");
  }
}

4、定义汽车工厂类

/**
 * @description: 汽车工厂类
 * @author: flygo
 * @time: 2022/7/5 10:03
 */
public class CarFactory {

  Movable create() {
    return new Car();
  }
}

5、定义飞机工厂类

/**
 * @description: 飞机工程类
 * @author: flygo
 * @time: 2022/7/5 10:04
 */
public class PlaneFactory {

  Movable create() {
    return new Plane();
  }
}

6、定义主方法类

/**
 * @description: 主方法
 * @author: flygo
 * @time: 2022/7/5 10:01
 */
public class FactoryMain {

  public static void main(String[] args) {
    Movable carMovable = new CarFactory().create();
    carMovable.go();

    Movable planeMovable = new PlaneFactory().create();
    planeMovable.go();
  }
}

三、简单工厂方法

/**
 * @description: 简单工厂方法
 * @author: flygo
 * @time: 2022/7/5 10:11
 */
public class SimpleVehicleFactory {

  public Car createCar() {
    return new Car();
  }

  public Plane createPlane() {
    return new Plane();
  }
}

四、AbstractFactory抽象方法

例子描述:假如魔法人现代人两种类型的人,两种人都有食物武器交通工具三种产品

  • 三种产品描述
    • 食物:输出食物名称方法(printName())
    • 武器:射击方法(shoot())
    • 交通工具:驾驶方法(go())
  • 魔法人三种具体产品是:
    • 食物:毒蘑菇
    • 武器:魔法棒
    • 交通工具:魔法扫帚
  • 现代人三种具体的产品是:
    • 食物:面包
    • 武器:AK47
    • 交通工具:汽车

通过不同的工厂抽象方法实现不同人的所拥有的不同产品族

1、定义抽象工厂、抽象产品类和方法

1.1、AbstractFactory 抽象工厂

/**
 * @description: 抽象工程方法
 * @author: flygo
 * @time: 2022/7/5 11:02
 */
public abstract class AbstractFactory {

  public abstract AbstractFood createFood();

  public abstract AbstractVehicle createVehicle();

  public abstract AbstractWeapon createWeapon();
}

1.2、AbstractFood 抽象的食物

/**
 * @description: 抽象的食物
 * @author: flygo
 * @time: 2022/7/5 11:03
 */
public abstract class AbstractFood {

  public abstract void printName();
}

1.3、AbstractVehicle抽象的交通工具

/**
 * @description: 抽象的交通工具
 * @author: flygo
 * @time: 2022/7/5 11:04
 */
public abstract class AbstractVehicle {
  public abstract void go();
}

1.4、AbstractVehicle抽象的武器

/**
 * @description: 抽象的武器
 * @author: flygo
 * @time: 2022/7/5 11:06
 */
public abstract class AbstractWeapon {
  public abstract void shoot();
}

2、定义魔法人具体工厂、产品类和方法

2.1、MagicFactory 魔法工厂类

MagicFactory 魔法工厂类 继承AbstractFactory 抽象工厂,同时实现抽象工厂方法

import tech.flygo.factory.abstractfactory.abstractf.AbstractFactory;
import tech.flygo.factory.abstractfactory.abstractf.AbstractFood;
import tech.flygo.factory.abstractfactory.abstractf.AbstractVehicle;
import tech.flygo.factory.abstractfactory.abstractf.AbstractWeapon;

/**
 * @description: 魔法工厂类
 * @author: flygo
 * @time: 2022/7/5 11:07
 */
public class MagicFactory extends AbstractFactory {

  @Override
  public AbstractFood createFood() {
    return new MashRoom();
  }

  @Override
  public AbstractVehicle createVehicle() {
    return new Broom();
  }

  @Override
  public AbstractWeapon createWeapon() {
    return new MagicStick();
  }
}

2.2、MashRoom 魔法蘑菇食物

MashRoom 魔法蘑菇食物 继承AbstractFood 抽象类型,同时实现抽象方法

import tech.flygo.factory.abstractfactory.abstractf.AbstractFood;

/**
 * @description: 魔法蘑菇食物
 * @author: flygo
 * @time: 2022/7/5 11:13
 */
public class MashRoom extends AbstractFood {

  @Override
  public void printName() {
    System.out.println("MashRoom food...");
  }
}

2.3、MagicStick 魔法棒定义

MagicStick 魔法棒 继承AbstractWeapon 抽象类型,同时实现抽象方法

import tech.flygo.factory.abstractfactory.abstractf.AbstractWeapon;

/**
 * @description: 魔法棒
 * @author: flygo
 * @time: 2022/7/5 11:15
 */
public class MagicStick extends AbstractWeapon {

  @Override
  public void shoot() {
    System.out.println("MagicStick shoot...");
  }
}

2.4、Broom 魔法棒定义

Broom 魔法扫帚 继承AbstractVehicle 抽象类型,同时实现抽象方法

import tech.flygo.factory.abstractfactory.abstractf.AbstractVehicle;

/**
 * @description: 魔法扫帚
 * @author: flygo
 * @time: 2022/7/5 11:11
 */
public class Broom extends AbstractVehicle {

  @Override
  public void go() {
    System.out.println("Broom go...");
  }
}

3、定义现代人具体工厂、产品类和方法

3.1、ModernFactory 现代工厂类

ModernFactory 现代工厂类 继承AbstractFactory 抽象工厂,同时实现抽象工厂方法

import tech.flygo.factory.abstractfactory.abstractf.AbstractFactory;
import tech.flygo.factory.abstractfactory.abstractf.AbstractFood;
import tech.flygo.factory.abstractfactory.abstractf.AbstractVehicle;
import tech.flygo.factory.abstractfactory.abstractf.AbstractWeapon;

/**
 * @description: 现代工厂类
 * @author: flygo
 * @time: 2022/7/5 11:16
 */
public class ModernFactory extends AbstractFactory {

  @Override
  public AbstractFood createFood() {
    return new Bread();
  }

  @Override
  public AbstractVehicle createVehicle() {
    return new Car();
  }

  @Override
  public AbstractWeapon createWeapon() {
    return new AK47();
  }
}

3.2、Bread 面包食物

Bread 面包食物食物 继承AbstractFood 抽象类型,同时实现抽象方法

import tech.flygo.factory.abstractfactory.abstractf.AbstractFood;

/**
 * @description: 面包食物
 * @author: flygo
 * @time: 2022/7/5 11:18
 */
public class Bread extends AbstractFood {

  @Override
  public void printName() {
    System.out.println("Bread...");
  }
}

3.3、AK47 武器AK47

AK47 武器AK47 继承AbstractWeapon 抽象类型,同时实现抽象方法

import tech.flygo.factory.abstractfactory.abstractf.AbstractWeapon;

/**
 * @description: 武器AK47
 * @author: flygo
 * @time: 2022/7/5 11:19
 */
public class AK47 extends AbstractWeapon {

  @Override
  public void shoot() {
    System.out.println("AK47 shoot...");
  }
}

3.4、Car汽车类定义

Car 汽车类 继承AbstractVehicle 抽象类型,同时实现抽象方法

import tech.flygo.factory.abstractfactory.abstractf.AbstractVehicle;

/**
 * @description: 汽车类
 * @author: flygo
 * @time: 2022/7/5 11:17
 */
public class Car extends AbstractVehicle {

  @Override
  public void go() {
    System.out.println("Car go...");
  }
}

4、定义 AbstractFactoryMain 抽象工厂方法主方法类

import tech.flygo.factory.abstractfactory.abstractf.AbstractFactory;
import tech.flygo.factory.abstractfactory.abstractf.AbstractFood;
import tech.flygo.factory.abstractfactory.abstractf.AbstractVehicle;
import tech.flygo.factory.abstractfactory.abstractf.AbstractWeapon;
import tech.flygo.factory.abstractfactory.magic.MagicFactory;

/**
 * @description: 抽象工厂方法主方法类
 * @author: flygo
 * @time: 2022/7/5 11:03
 */
public class AbstractFactoryMain {

  public static void main(String[] args) {

    System.out.println("-------生成一组产品族(魔法)-------");
    // 生成一组产品族(魔法)
    AbstractFactory magicFactory = new MagicFactory();

    AbstractFood food1 = magicFactory.createFood();
    food1.printName();

    AbstractWeapon weapon1 = magicFactory.createWeapon();
    weapon1.shoot();

    AbstractVehicle vehicle1 = magicFactory.createVehicle();
    vehicle1.go();

    System.out.println("-------生成一组产品族(现代)-------");
    // 生成一组产品族(现代)
    AbstractFactory modernFactory = new MagicFactory();

    AbstractFood food2 = modernFactory.createFood();
    food2.printName();

    AbstractWeapon weapon2 = modernFactory.createWeapon();
    weapon2.shoot();

    AbstractVehicle vehicle2 = modernFactory.createVehicle();
    vehicle2.go();
  }
}

输出结果

四、源码地址

GitHub - jxaufang168/Design-Patterns: 设计模式学习设计模式学习. Contribute to jxaufang168/Design-Patterns development by creating an account on GitHub.icon-default.png?t=N7T8https://github.com/jxaufang168/Design-Patterns



 

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

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

相关文章

AJAX入门到实战,学习前端框架前必会的(ajax+node.js+webpack+git)(七)

08.什么是模块化? CommonJS 标准 09.ECMAScript 标准 - 默认导出和导入 10.ECMAScript 标准 - 命名导出和导入 11.包的概念 实操: server.js utils/lib/index.js utils/package.json 12.npm - 软件包管理器 13.npm - 安装所有依赖 从别处(网…

RTSP网络视频协议

一.RTSP网络视频协议介绍 RTSP是类似HTTP的应用层协议,一个典型的流媒体框架网络体系可参考下图,其中rtsp主要用于控制命令,rtcp主要用于视频质量的反馈,rtp用于视频、音频流从传输。 1、RTSP(Real Time Streaming P…

利用gulp工具对常规web项目进行压缩打包

前言 对于一个常规的web项目,如下项目目录 |- imgs | - img1.png | - img2.png |- js | - user.js | - utils.js |- css | - index.css | - user.css |- html | - user.html |- index.html可以使用各种构建工具(如webpack、gulp、grunt等)来…

IBM X3750 M4服务器主板故障全国协助处理

2023年12月31这天中午看到有位网络朋友加我,通过后该用户反馈说是有一台IBM System x3750 M4服务器有故障,现在无法开机。希望我们工程师协助他检测 分析 定位该故障问题原因和处理方案。 如上图所示:经过工程师与用户排查,发现该…

instanceof、对象类型转化、static关键字

instanceof 与 对象类型转换 instanceof是判断一个对象是否与一个类有关系的关键字 先看引用类型,再看实际类型 *例子:obj instanceof A 先看obj的类型是否与A有关联,无关联则报错,有关联则判断obj的实际类型 因为obj的实际类…

SwiftUI之深入解析布局协议

一、什么是布局协议? 采用布局协议类型的任务,是告诉 SwiftUI 如何放置一组视图,需要多少空间。这类型常常被作为视图容器,虽然布局协议是 2022 年新推出的(至少公开来说),但是我们在第一天使用…

【Web】token机制

🍎个人博客:个人主页 🏆个人专栏:Web ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 机制基本: 优势: 结语 我的其他博客 前言 在当今互联网时代,安全、高效的用户身份验证和资源授…

87.乐理基础-记号篇-反复记号(一)反复、跳房子

内容参考于:三分钟音乐社 上一个内容:86.乐理基础-记号篇-速度记号-CSDN博客 首先是反复记号表总结图: 当前是写前两个记号,其余记号后面写:这些反复记号最主要的目的很简单,还是为了节约纸张&#xff0c…

python如何安装numpy

1. 根据python版本下载相应版本的numpy保存至D:\Program Files (x86)\Python\Python37\Scripts\ numpy下载地址 2. winR,输入cmd,打开命令行窗口,定位到python的安装目录 3. 输入python -m pip install numpy或定位到目录:D:\P…

【C++】:C++中的STL序列式容器vector源码剖析

⛅️一 vector概述 vector的使用语法可以参考文章:​ 总的来说:vector是可变大小数组 特点: 支持快速随机访问。在尾部之外的位置插入或删除元素可能很慢 元素保存在连续的内存空间中,因此通过下标取值非常快 在容器中间位置添加…

Laravel 框架中队列的使用

概述 Laravel 框架内置了强大的队列系统,用于处理异步任务、提高系统性能等。队列可以让任务异步执行,而不会阻塞当前进程,可以提高系统的处理能力。 Laravel 的队列系统支持多种驱动,如 Redis、Beanstalkd、SQS 等,…

VSCode 搭建Java开发环境

笔者使用最多的语言是C,也使用过不少其它语言,像Erlang,Python,Lua,C#等等,目前项目中在使用Go,但是没使用过Java。最近看到C#夺冠,首次荣获 TIOBE 年度编程语言,同时也看…

计算机缺失msvcp140.dll的修复教程,教你快速解决dll问题

“针对计算机系统中出现的msvcp140.dll文件丢失问题,小编将详细阐述一系列有效的解决方法。首先,msvcp140.dll是Microsoft Visual C Redistributable Package中的一个关键动态链接库文件,对于许多应用程序的正常运行至关重要。当系统提示该文…

关于Python里xlwings库对Excel表格的操作(三十一)

这篇小笔记主要记录如何【如何使用“Chart类”、“Api类"和“Axes函数”设置绘图区外框线型、颜色、粗细及填充颜色】。前面的小笔记已整理成目录,可点链接去目录寻找所需更方便。 【目录部分内容如下】【点击此处可进入目录】 (1)如何安…

【DevOps-08-3】Jenkins容器内部使用Docker

一、简要描述 构建镜像和发布镜像到harbor都需要使用到docker命令。而在Jenkins容器内部安装Docker官方推荐直接采用宿主机带的Docker即可。 设置Jenkins容器使用宿主机Docker。 二、配置和操作步骤 1、修改宿主机docker.sock权限 # 修改docker.sock 用户和用户组都为root $ …

计算机找不到msvcr100.dll的多种解决方法分享,轻松解决dll问题

msvcr100.dll作为系统运行过程中不可或缺的一部分,它的主要功能在于提供必要的运行时支持,确保相关应用程序能够顺利完成编译和执行。因此,当操作系统或应用程序在运行阶段搜索不到该文件时,自然会导致各类依赖于它的代码无法正常…

vue3+acro实现日期组件可以直接展示在界面上,不用非得弹框展示

前言: 在很多时候,我们使用日期组件的时候,不希望每次都是点击弹出日期弹框,而是,点击日期弹框直接能展示在界面上,在这里我们介绍下 使用 acro 来更加轻松的实现他的效果。 实现效果: 实现步骤…

Skywalking UI页面中操作的各种实用功能汇总

刚刚接触skywalking不久,在这里总结一下在UI页面中操作的各种实用功能,随着使用的不断深入,我也会对文章进行持续补充。 本文skywalking 的ui入口是官方demo ,版本是10.0.0-SNAPSHOT-593bd05 http://demo.skywalking.apache.org…

Linux(Debina12)系统安装

在开发或学习中,linux系统是我们必须要熟悉的系统,那么今天就记录一下,较为稳定,也是小编这几年当做开发环境的发行版吧 官网地址 https://www.debian.org 下载链接 http://mirrors.163.com/debian-cd/12.4.0/amd64/iso-dvd/ …

【LeetCode每日一题】2085. 统计出现过一次的公共字符串(哈希表)

2024-1-12 文章目录 [2085. 统计出现过一次的公共字符串](https://leetcode.cn/problems/count-common-words-with-one-occurrence/)思路:哈希表计算 2085. 统计出现过一次的公共字符串 思路:哈希表计算 1.用两个哈希表分别统计word1和word2中字符出现的…