【设计模式-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.mzph.cn/news/616795.shtml

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

相关文章

oracle 12c pdb expdp/impdp 数据导入导出

环境 (源)rac 环境 byoradbrac 系统版本:Red Hat Enterprise Linux Server release 6.5 软件版本:Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit byoradb1:172.17.38.44 byoradb2:172.17.38.45 (目的&am…

轻松上手Linux文件操作:五种方法教你创建文件

轻松上手Linux文件操作:五种方法教你创建文件 一、引言二、使用touch命令创建文件三、使用文本编辑器创建文件四、使用echo命令创建文件五、使用cat命令创建文件六、使用重定向符号创建文件七、总结 一、引言 本文介绍五种在Linux系统中创建文件的方法,…

公共用例库计划--个人版(三)导出Excel功能

1、任务概述 本次计划的核心任务是开发一个,个人版的公共用例库,旨在将各系统和各类测试场景下的通用、基础以及关键功能的测试用例进行系统性地归纳整理,并以提高用例的复用率为目标,力求最大限度地减少重复劳动,提升…

网络层协议及IP编址与IP路由基础华为ICT网络赛道

目录 4.网络层协议及IP编址 4.1.网络层协议 4.2.IPv4地址介绍 4.3.子网划分 4.4.ICMP协议 4.5.IPv4地址配置及基本应用 5.IP路由基础 5.1.路由概述 5.2.静态路由 5.3.动态路由 5.4.路由高阶特性 4.网络层协议及IP编址 4.1.网络层协议 IPv4(Internet Protocol Versi…

Pygame程序的屏幕显示

不同对象的绘制与显示过程 在Pygame中,需要将所有需要在屏幕上显示的内容都绘制在一个display surface上。该Surface通常称为screen surface,它是pygame.display.set_mode()函数返回的Surface对象。 在绘制不同对象时,可以使用不同的绘制方…

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

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

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

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

C语言基础语法跟练 day3

31、不使用累计乘法的基础上&#xff0c;通过移位运算&#xff08;<<&#xff09;实现2的n次方的计算。 #include <stdio.h> int main() {int i 0;scanf("%d",&i);printf("%d",1<<i);return 0; } 32、问题&#xff1a;一年约有 3.…

c#多线程中使用SemaphoreSlim

SemaphoreSlim是一个用于同步和限制并发访问的类&#xff0c;和它类似的还有Semaphore&#xff0c;只是SemaphoreSlim更加的轻量、高效、好用。今天说说它&#xff0c;以及如何使用&#xff0c;在什么时候去使用&#xff0c;使用它将会带来什么优势。 代码的业务是&#xff1a…

档案数字化怎样快速整理资料

对于机构和组织来说&#xff0c;档案数字化是一个重要的信息管理和保护措施。要快速整理资料进行档案数字化&#xff0c;可以遵循以下步骤&#xff1a; 1. 准备工具和设备&#xff1a;确保有一台计算机、扫描仪和相关软件。 2. 分类和组织资料&#xff1a;先将资料分类&#xf…

代码随想录Day.31 | 455. 分发饼干、376. 摆动序列、53. 最大子序和

455. 分发饼干 1. LeetCode链接 455. 分发饼干 - 力扣&#xff08;LeetCode&#xff09; 2. 题目描述 3. 解法 贪心法&#xff0c;首先想到的是&#xff0c;局部最优&#xff1a;让每个孩子尽可能拿能拿到的最小饼干尺寸。为了方便查找&#xff0c;这就要求至少饼干尺寸是从…

MySQL的Windows系统安装

一、MySQL的Windows系统安装 1、下载MySQL安装包 打开如下链接地址&#xff0c;下载安装包 2、安装并配置 双击下载好的安装包进行安装&#xff0c;出现如下界面&#xff1a; 选择【 Full 】选项&#xff0c;然后单击【 Next 】按钮。 出现如下界面&#xff0c;单击【 Execute…

【野火i.MX6NULL开发板】挂载 NFS 网络文件系统

0、前言 参考资料&#xff1a; &#xff08;误人子弟&#xff09;《野火 Linux 基础与应用开发实战指南基于 i.MX6ULL 系列》PDF 第22章 参考视频&#xff1a;&#xff08;成功&#xff09; https://www.bilibili.com/video/BV1JK4y1t7io?p26&vd_sourcefb8dcae0aee3f1aab…

Jmeter Linux环境压测Lottery接口

1、把Dubbo插件放到Linux中Jmeter的lib/ext目录下 2、参数化 3、设置线程数 4、把测试计划中的Dubbo路径替换成Linux中的路径 /home/apache-jmeter-5.5/lib/ext 5、上传压测脚本到压力机 6、执行压测&#xff0c;观察是否有消息积压 ①Jmeter中执行压测脚本 ②检查mq控制台是…

数字图像线性滤波——方框、均值、高斯滤波及opencv(C++)实现示例

数字图像线性滤波——方框、均值、高斯滤波及opencv&#xff08;C&#xff09;实现示例 一、图像滤波概念简介二、方框滤波及opencv实现示例1、方框滤波的公式2、opencv方框滤波boxfilter()函数&#xff08;1&#xff09;函数介绍&#xff08;2&#xff09;opencv实现实例&…

查看SQL Server的表字段类型、长度、描述以及是否可为null

文章目录 初步理解小步测试组合一下参考文章有更详细评述 继续理解得到大部分信息 本文参考&#xff1a;https://blog.csdn.net/josjiang1/article/details/80558068。 也可以直接点击这里文章链接&#xff1a; sql server查询表结构&#xff08;字段名&#xff0c;数据类型&a…

CSS 中的伪装大师:伪类和伪元素的奇妙世界

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

双指针问题——求只包含两个元素的最长连续子序列(子数组)

一&#xff0c;题目描述 你正在探访一家农场&#xff0c;农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示&#xff0c;其中 fruits[i] 是第 i 棵树上的水果 种类 。 你想要尽可能多地收集水果。然而&#xff0c;农场的主人设定了一些严格的规矩&#xff0c;你必…

代码随想录 Leetcode203. 移除链表元素

题目&#xff1a; 代码(首刷看解析 2024年1月11日&#xff09;&#xff1a; class Solution { public:ListNode* removeElements(ListNode* head, int val) {if(headnullptr) return nullptr;ListNode* BeforeHead new ListNode(0,head);ListNode* temp BeforeHead;while(te…

逆向分析爬取网页动态

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