【设计模式-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 {@Overridepublic void go() {System.out.println("Car go...");}
}

3、定义Plane飞机对象

/*** @description: 飞机对象* @author: flygo* @time: 2022/7/5 10:01*/
public class Plane implements Movable {@Overridepublic 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 {@Overridepublic AbstractFood createFood() {return new MashRoom();}@Overridepublic AbstractVehicle createVehicle() {return new Broom();}@Overridepublic 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 {@Overridepublic 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 {@Overridepublic 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 {@Overridepublic 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 {@Overridepublic AbstractFood createFood() {return new Bread();}@Overridepublic AbstractVehicle createVehicle() {return new Car();}@Overridepublic 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 {@Overridepublic 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 {@Overridepublic 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 {@Overridepublic 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



 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

科技创新领航 ,安川运动控制器为工业自动化赋能助力

迈入工业4.0时代,工业自动化的不断发展,让高精度运动控制成为制造业高质量发展的重要技术手段。北京北成新控伺服技术有限公司作为一家集工业自动化产品销售、系统设计、开发、服务于一体的高新技术企业,其引进推出的运动控制产品一直以卓越的…

详解Oracle数据库的启动

Oracle数据库的启动,其概念可参考Overview of Instance and Database Startup。 其过程可参见下图: 当数据库从关闭状态进入打开数据库状态时,它会经历以下阶段。 阶段Mount状态描述1实例在没有挂载数据库的情况下启动实例已启动&#xff…

共融共生:智慧城市与智慧乡村的协调发展之路

随着科技的飞速发展和全球化的不断深入,智慧城市和智慧乡村作为现代社会发展的重要组成部分,正逐渐成为人们关注的焦点。然而,在追求经济发展的过程中,城乡发展不平衡的问题也日益凸显。因此,如何实现智慧城市与智慧乡…

完整的模型验证套路

读取图片 from PIL import Imageimg_path "../Yennefer_of_Vengerberg.jpg" image Image.open(img_path) print(image)转换成灰度图(可选) image image.convert(L) image.show()转换成RGB格式 image image.convert(RGB)因为png格式是四…

STM32F103RCT6开发板M3单片机教程07-TIMER1CH1输出 PWM做LED呼吸灯

概述 本教程使用是(光明谷SUN_STM32mini开发板) 免费开发板 在谷动谷力社区注册用户,打卡,发帖求助都可以获取积分,当然最主要是发原创应用文档奖励更多积分. (可用积分换取,真的不用钱&…

Goby 漏洞发布|用友 NC registerServlet 反序列化远程代码执行漏洞

漏洞名称:用友 NC registerServlet 反序列化远程代码执行漏洞 English Name:Yonyou NC registerServlet Deserialize Remote Code Execute Vulnerability CVSS core: 9.8 影响资产数: 21320 漏洞描述: 用友 NC Cloud 是一种商…

熟悉HBase常用操作

1. 用Hadoop提供的HBase Shell命令完成以下任务 (1)列出HBase所有表的相关信息,如表名、创建时间等。 启动HBase: cd /usr/local/hbase bin/start-hbase.sh bin/hbase shell列出HBase所有表的信息: hbase(main):001:0> list(2)在终端输出指定表的所有记录数据。 …

k8s-存储 11

一、configmapu存储 首先,确保集群正常,节点都处于就绪状态 Configmap用于保存配置数据,以键值对形式存储。configMap资源提供了向 Pod 注入配置数据的方法,旨在让镜像和配置文件解耦,以便实现镜像的可移植性和可复用…

kylin集群反向代理(健康检查)

前面一篇文章提到了使用nginx来对kylin集群进行反向代理, kylin集群使用nginx反向代理-CSDN博客文章浏览阅读349次,点赞8次,收藏9次。由于是同一个集群的,元数据没有变化,所以,直接将原本的kylin使用scp的…

RabbitMQ(六)消息的持久化

目录 一、简介1.1 定义1.2 消息丢失的场景 二、交换机的持久化方式一:直接 new方式二:channel.exchangeDeclare()方式三:ExchangeBuilder【推荐】 三、队列的持久化方式一:直接 new方式二:channel.queueDeclare()方式三…

C++核心编程——类和对象(二)

本专栏记录C学习过程包括C基础以及数据结构和算法,其中第一部分计划时间一个月,主要跟着黑马视频教程,学习路线如下,不定时更新,欢迎关注。 当前章节处于: ---------第1阶段-C基础入门 ---------第2阶段实战…

AI绘画软件Stable Diffusion模型/Lora/VAE文件存放位置

型下载说明(下载模型后输入对应参数即可生成) 建议直接去civitai.com找模型,如果无法找到可以在幕后模型区找也可以去, 下载好后放入对应的文件夹。进入127.0.0.1:7680 左上角刷新即可看到新的模型。 模型种类 大模型 大模型特…

基于springboot+vue药店管理系统

摘要 药店管理系统的设计和应用在当前社会背景下具有巨大的实际意义和社会价值。随着医药行业的不断发展和社会健康水平的提高,药店作为医疗服务的一部分,其管理方式也需要不断创新与优化。该系统的研究不仅关系到单一药店的运营效率,更涉及到…

植物大战僵尸小游戏抖音快手直播搭建弹幕插件教程

植物大战弹幕插件功能介绍 该插件由梦歌技术部团队支持开发,本插件软件通过监测抖音弹幕信息,获取礼物数据触发脚本插件对应的功能; 功能目前基本上已经完善,后期功能会陆续上线支持更新,全新的脚本监测稳定方便实用…

逆向分析爬取网页动态

本例子以爬取人民邮电出版社网页新书的信息为例 由于页面是动态的,信息会不停地更新,所以不同时间的爬取结果会不同。

[足式机器人]Part3 机构运动学与动力学分析与建模 Ch00-2(1) 质量刚体的在坐标系下运动

本文仅供学习使用,总结很多本现有讲述运动学或动力学书籍后的总结,从矢量的角度进行分析,方法比较传统,但更易理解,并且现有的看似抽象方法,两者本质上并无不同。 2024年底本人学位论文发表后方可摘抄 若有…

ORB SLAM2 编译

文章目录 软件版本编译编译自动编译手动编译 运行结果运行截图轨迹分析 软件版本 Pangolin0.6opencv3.4.0 ORB SLAM2 编译 # 更改Opencv依赖版本与添加Pangolin依赖 # CMakelist.txt更改 LIST(APPEND CMAKE_PREFIX_PATH /usr/local/opencv-3.4) # 添加 LIST(APPEND CMAKE_PR…

day15 层序遍历 翻转二叉树 对称二叉树

题目1:102 二叉树的层序遍历 题目链接:102 二叉树的层序遍历 题意 根据二叉树的根节点root,返回其节点值的层序遍历 借助队列实现,因为队列是先进先出的逻辑,符合层序遍历一层一层遍历的思想 代码 /*** Definitio…

Linux tail命令详解和高级用法举例

目 录 一、概述 二、tail命令解释 1.命令格式; 2.功能 3.选项 4.选项的基本用法 (1) 显示行号 (2)忽略指定字符数 (3) 不显示文件名 三…

C语言实现简易n子棋小游戏(代码含注解)

利用C语言简单实现一个n子棋小游戏,棋盘大小由自己定义 将源文件分为 执行游戏的测试文件(test.c)和保存游戏运行逻辑的相关函数的文件(game.c) 头文件中声明符号和函数的定义(game.h) 游戏执行主要依靠二维数组实现,电脑走棋采用随机值的方法简易地…