【设计模式-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系统中创建文件的方法,…

Dayjs使用

官方文档:安装 | Day.js中文网 相对moment.js而已,day.js的体积更小,只有2KB左右;moment.min.js 有16.7KB。 常用方法: import dayjs from dayjs;// 格式化 console.log(dayjs().format(YYYY-MM-DD HH:mm:ss)); // 2…

缓存解析:从架构设计到Redis应用及最佳实践

典型架构设计中缓存的存储位置 在现代软件架构中,缓存是优化数据检索、提高应用性能的关键组件。缓存的存储位置多种多样,每个位置针对特定的优化目标和需求。理解这些层级对于设计高效的系统至关重要。 浏览器缓存:这是最接近用户端的缓存层…

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

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

Docker Compose 部署 jenkins

Docker Compose 部署 jenkins jenkins 部署 Docker-Compose 部署 version: 3.1 services:jenkins:image: jenkinsci/blueoceanvolumes:- /data/jenkins/:/var/jenkins_home- /var/run/docker.sock:/var/run/docker.sock- /usr/bin/docker:/usr/bin/docker- /usr/lib/x86_64-…

网络层协议及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…

第二百六十二回

文章目录 概念介绍使用方法示例代码使用扩展 我们在上一章回中介绍了flutter_screenutil包相关的内容,本章回中将介绍dart中的setter/getter方法.闲话休提,让我们一起Talk Flutter吧。 概念介绍 我们在这里介绍的setter/getter方法属于编程语言中的知识…

Android MediaCodec 简明教程(一):使用 MediaCodecList 查询 Codec 信息,并创建 MediaCodec 编解码器

系列文章目录 文章目录 系列文章目录前言一、MediaCodecList 是什么?二、MediaCodecList 使用方法1. 获取 MediaCodecList 实例2. 列出设备上支持的编解码器3. 获取编解码器详细信息4. 判断设备是否支持某种编解码器5. 查询默认的编解码器 三、通过 MediaCodecList …

【Java 设计模式】设计原则之开放封闭原则

文章目录 1. 定义2. 好处3. 应用4. 示例结语 在软件开发中,设计原则是创建灵活、可维护和可扩展软件的基础。 这些原则为我们提供了指导方针,帮助我们构建高质量、易理解的代码。 ✨单一职责原则(SRP) ✨开放/封闭原则&#xff08…

69、python - 利用向量内积来优化卷积运算

上一节介绍了利用 python 实现的原始卷积版本性能很差的原因,不知道各位同学有尝试的么? 这一节介绍下如何对卷积的乘累加进行一次优化:我们利用 np.dot 来进行优化。 np.dot np.dot 是 numpy 库提供的一个函数,用来计算两个向量的点积,或者叫内积。那什么是内积呢? …

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语言学习记录—进阶作业(通讯录动态版本)

动态版本通讯录 1. 通讯录默认能够存放3个人的信息。 2. 如果空间不够&#xff0c;就增加空间&#xff0c;每次增加2个人的空间。 contact.h文件 #pragma once #include <string.h> #include <stdio.h> #include <assert.h> #include <stdlib.h>#de…

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.…

L1-023 输出GPLT(Java)

给定一个长度不超过10000的、仅由英文字母构成的字符串。请将字符重新调整顺序&#xff0c;按GPLTGPLT....这样的顺序输出&#xff0c;并忽略其它字符。当然&#xff0c;四种字符&#xff08;不区分大小写&#xff09;的个数不一定是一样多的&#xff0c;若某种字符已经输出完&…

c#多线程中使用SemaphoreSlim

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

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

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

【linux】利用echo命令实现不换行的倒计时

1、实现5秒倒计时 #!/bin/shfor i in `seq 5`doecho -ne "$i\b"sleep 1 done 2、实现“时:分:秒”格式的倒计时 这个脚本会从5小时开始,每秒更新一次,以时:分:秒的格式显示倒计时,实现一个从5小时倒计时到0的功能。echo -ne "\r"会将光标移动到当前行…