Spring常用到的几种设计模式--工厂模式

article/2025/10/16 18:47:09

一、工厂模式

工厂模式核心思想:只关心结果,隐藏复杂的过程

二、简单的工厂模式

在这里插入图片描述

BaoMa

/** Copyright (C), 2013-2019, 天津大海云科技有限公司*/
package com.jikang.factory;/*** @author yangjikang* @date 2019/8/8 11:49* @modified By yangjikang* @since*/
public class BaoMa implements Car {private String name = "宝马";@Overridepublic String getName() {return this.name;}
}

BenChi

/** Copyright (C), 2013-2019, 天津大海云科技有限公司*/
package com.jikang.factory;/*** @author yangjikang* @date 2019/8/8 11:49* @modified By yangjikang* @since*/
public class BenChi implements Car {private String name = "奔驰";@Overridepublic String getName() {return this.name;}
}

Car

/** Copyright (C), 2013-2019, 天津大海云科技有限公司*/
package com.jikang.factory;/*** @author yangjikang* @date 2019/8/8 11:40* @modified By yangjikang* @since*/
public interface Car {public String getName();
}

QiRui

/** Copyright (C), 2013-2019, 天津大海云科技有限公司*/
package com.jikang.factory;/*** @author yangjikang* @date 2019/8/8 11:49* @modified By yangjikang* @since*/
public class QiRui implements Car {private String name = "奇瑞";@Overridepublic String getName() {return this.name;}
}

SimpleFactory

/** Copyright (C), 2013-2019, 天津大海云科技有限公司*/
package com.jikang.factory;/*** @author yangjikang* @date 2019/8/8 11:55* @modified By yangjikang* @since*/
public class SimpleFactory {public Car getCar(String name){if ("奔驰".equals(name)){return new BenChi();}else if ("奇瑞".equals(name)){return new QiRui();}else if ("宝马".equals(name)){return new BaoMa();}else{return new Car() {@Overridepublic String getName() {return "不能生产该产品....";}};}}
}

TestEnter

/** Copyright (C), 2013-2019, 天津大海云科技有限公司*/
package com.jikang.factory;/*** @author yangjikang* @date 2019/8/8 11:59* @modified By yangjikang* @since*/
public class TestEnter {public static void main(String[] args) {Car baoma = new SimpleFactory().getCar("宝马");System.out.println(baoma.getName());}
}

在这里插入图片描述
在这里插入图片描述

简单工厂可以造很多种汽车品牌的车子。奔驰、宝马、奇瑞、、、、、

这样不符合实际生活,你见过哪个工厂能造这么多汽车品牌 的车子的?

下面就引伸出了 方法工厂

三、方法工厂

上面我们说了,一个汽车制造厂不可能造出很多汽车品牌的车子。所以现实生活中每个汽车品牌都有自己的工厂。
宝马有宝马汽车工厂、奥迪有奥迪汽车工厂、、、、、、

但是这些汽车工厂需要一个标准吧?不可能奥迪汽车生产的汽车有三个轮子,宝马生产的有五个轮子?

所以我们要有一个约束规则。就好比你们平时手机数据线一样,安卓的、苹果的、现在好像还有Type-c的。你见过第四种?

这就是一种约束。

在这里插入图片描述

BaoMaFactory

/** Copyright (C), 2013-2019, 天津大海云科技有限公司*/
package com.jikang.factory.func;import com.jikang.factory.BaoMa;
import com.jikang.factory.Car;/*** @author yangjikang* @date 2019/8/8 14:06* @modified By yangjikang* @since*/
public class BaoMaFactory implements CarFactory{@Overridepublic Car getCar() {return new BaoMa();}
}

BenChiFactory

/** Copyright (C), 2013-2019, 天津大海云科技有限公司*/
package com.jikang.factory.func;import com.jikang.factory.BenChi;
import com.jikang.factory.Car;
import com.jikang.factory.QiRui;/*** @author yangjikang* @date 2019/8/8 14:06* @modified By yangjikang* @since*/
public class BenChiFactory implements CarFactory{@Overridepublic Car getCar() {return new BenChi();}
}

CarFactory

/** Copyright (C), 2013-2019, 天津大海云科技有限公司*/
package com.jikang.factory.func;import com.jikang.factory.Car;/*** 汽车工厂约束规则** @author yangjikang* @date 2019/8/8 14:07* @modified By yangjikang* @since*/
public interface CarFactory {Car getCar();
}

QiRuiFactory

/** Copyright (C), 2013-2019, 天津大海云科技有限公司*/
package com.jikang.factory.func;import com.jikang.factory.BaoMa;
import com.jikang.factory.Car;
import com.jikang.factory.QiRui;/*** @author yangjikang* @date 2019/8/8 14:06* @modified By yangjikang* @since*/
public class QiRuiFactory implements CarFactory{@Overridepublic Car getCar() {return new QiRui();}
}

TestFuncFactory

/** Copyright (C), 2013-2019, 天津大海云科技有限公司*/
package com.jikang.factory.func;import com.jikang.factory.Car;/*** 方法工厂测试类** @author yangjikang* @date 2019/8/8 14:09* @modified By yangjikang* @since*/
public class TestFuncFactory {public static void main(String[] args) {Car car = new BenChiFactory().getCar();System.out.println(car.getName());}
}

需要什么车子就去找哪个工厂造。

那么显示生活中,你想买个奔驰车,不可能还要跑到奔驰生产厂,让它去上产吧?

一般你都会去店里,跟老板说,我想买个奔驰、老板就会从奔驰厂去进货,你说你想要宝马,老板就回去宝马厂商进货。

所以你想买什么车子,直接找老板就行了。

所以就引申出了 抽象工厂

四、抽象工厂

抽象工厂肯定要有一个抽象方法。为什么要用抽象工厂呢?为什么不用简单类和接口呢?

这就说为什么我们讲问题要循序渐进

我们一开始讲的简单工厂,缺点是什么?缺少分工,大杂烩,一个工厂做了所有工厂的事。

所以我们用方法工厂来分工。每个工厂做自己的事。

再然后我们讲了抽象工厂,就是简单工厂方法工厂的结合。

好处是什么呢?

以前用户有简单工厂的时候用户很方便,想要什么直接跟工厂说,但是这个工厂压力肯定大啊,全国那么多人,买个车还要排队等?

后来用了方法工厂工厂是方便了,但是用户复杂了,要自己去某某工厂要车子。

现在的抽象工厂模式,工厂方便了,用户也方便了。

在这里插入图片描述
AbstractFactory

/** Copyright (C), 2013-2019, 天津大海云科技有限公司*/
package com.jikang.factory.abstr;import com.jikang.factory.BaoMa;
import com.jikang.factory.BenChi;
import com.jikang.factory.Car;
import com.jikang.factory.QiRui;/*** @author yangjikang* @date 2019/8/8 14:31* @modified By yangjikang* @since*/
public abstract class AbstractFactory {abstract Car getCar();public Car getCar(String name){if ("奔驰".equals(name)){return new BenChiFactory().getCar();}else if ("奇瑞".equals(name)){return new QiRuiFactory().getCar();}else if ("宝马".equals(name)){return new BaoMaFactory().getCar();}else{return new Car() {@Overridepublic String getName() {return "不能生产该产品....";}};}}
}

AbstractFactoryTest

/** Copyright (C), 2013-2019, 天津大海云科技有限公司*/
package com.jikang.factory.abstr;/*** @author yangjikang* @date 2019/8/8 14:36* @modified By yangjikang* @since*/
public class AbstractFactoryTest {public static void main(String[] args) {DefaultAbstractFactory defaultAbstractFactory = new DefaultAbstractFactory();System.out.println(defaultAbstractFactory.getCar("asdasd").getName());}
}

BaoMaFactory

/** Copyright (C), 2013-2019, 天津大海云科技有限公司*/
package com.jikang.factory.abstr;import com.jikang.factory.BaoMa;
import com.jikang.factory.Car;
import com.jikang.factory.func.CarFactory;/*** @author yangjikang* @date 2019/8/8 14:06* @modified By yangjikang* @since*/
public class BaoMaFactory extends AbstractFactory{@OverrideCar getCar() {return null;}
}

BenChiFactory

/** Copyright (C), 2013-2019, 天津大海云科技有限公司*/
package com.jikang.factory.abstr;import com.jikang.factory.BenChi;
import com.jikang.factory.Car;
import com.jikang.factory.func.CarFactory;/*** @author yangjikang* @date 2019/8/8 14:06* @modified By yangjikang* @since*/
public class BenChiFactory extends AbstractFactory{@Overridepublic Car getCar() {return new BenChi();}}

DefaultAbstractFactory

/** Copyright (C), 2013-2019, 天津大海云科技有限公司*/
package com.jikang.factory.abstr;import com.jikang.factory.Car;/*** @author yangjikang* @date 2019/8/8 14:36* @modified By yangjikang* @since*/
public class DefaultAbstractFactory extends AbstractFactory{private QiRuiFactory qiRuiFactory = new QiRuiFactory();@OverrideCar getCar() {return this.qiRuiFactory.getCar();}
}

QiRuiFactory

/** Copyright (C), 2013-2019, 天津大海云科技有限公司*/
package com.jikang.factory.abstr;import com.jikang.factory.Car;
import com.jikang.factory.QiRui;
import com.jikang.factory.func.CarFactory;/*** @author yangjikang* @date 2019/8/8 14:06* @modified By yangjikang* @since*/
public class QiRuiFactory extends AbstractFactory{@Overridepublic Car getCar() {return new QiRui();}
}

http://chatgpt.dhexx.cn/article/3tMqIFdn.shtml

相关文章

php-工厂模式实现

php-工厂模式实现 概述 工厂模式(Factory Pattern):在工厂模式中,可以根据参数的不同返回不同类的实例。工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。 还是拿工厂模式现实中中的例子: 现…

工厂模式整理

从部分博客摘录过来 定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类。 个人理解:顾名思义工厂模式就是按照工厂流水线的模式去生成产品,其设计思想就是提取产品的共性去制造流水线(接口包含的方法&#x…

Android源码设计模式——工厂模式

工厂模式也是为了构建一个新的对象,它是创建型模式的一种。 Android源码设计模式——Build模式(应用:AlertDialog源码分析) 上述是之前的Build模式,也是创建型模式一种,不懂的小伙伴可以回看下上篇博客。 …

设计模式 -- 工厂模式

工厂的指责就是制作产品,那么产品就可以理解为是我们的对象,而工厂就是为了实例化对象而对象的,根据工厂的抽象程度可分为工厂方法模式和抽象工厂模式。该模式用于封装和管理对象的创建,是一种创建型模式。 1、简单工厂模式 简单…

Vue轮子-Lottie-动画实现

不要问为什么 没有为什么。浮躁的7月首周。Keep Going And Stay Strong。 Lottie是一个IOS,Android和React Native库,可以实时渲染动画,动画被转化成JSON文件,节省了很多资源,允许应用程序像使用静态图像一样轻松使用…

java造轮子_RxJava 自己造轮子一

RXJava 造轮子 什么是rxjava? rxjava 是一个响应式编程,为了更好更优雅的处理异步时间,内部实现原理是观察者模式 自己造轮子实现Rxjava 观察者模式核心有两个,一个观察者一个被观察者 先创建一个被观察者observer(基层抽象类) //观察者的基…

react hook 造轮子

GitHub地址:https://github.com/rayhomie/rayhomieUI 一、sass的使用 1、import方式引入scss文件,后面必须带后缀名scss import "main.scss";2、Partials方式引入base.scss文件,文件必须以(下划线)开头,可以不用带后…

「轮子工厂」谭庆波,很高兴认识大家!

我是谁: 我叫谭庆波,网名厂长。 首先我是一名学生,哈工大计算系的博士生,也是一个喜欢在互联网上折腾的95后。 2015年开始写博客,累计输出博客500多篇,访问量超百万; 2018年开始做公众号和知乎&…

前端轮子厂

1. Element Element-Ul是饿了么前端团队推出的一款基于Vue.js 2.0 的桌面端UI框架,一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库,手机端有对应框架是Mint UI 。 中文文档:http://element-cn.eleme.io/#/zh-CN github地址…

前端_Vue_1.初识Vue

文章目录 一、前言二、开始1 简介1.1 什么是Vue?1.2 渐进式框架1.3 单文件组件1.4. API风格1.4.1. 选项式API(Options API)1.4.2. 组合式API(Composition API)1.4.3. 该选哪个? 2. 快速上手(学前…

Nginx-学习一

什么是Nginx Nginx是一个http服务器。 是一个使用c语言开发的高性能的http服务器及反向代理服务器。 Nginx是一款高性能的http 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。由俄罗斯的程序设计师Igor Sysoev所开发,官方测试ngin…

Nginx学习二

文章目录 一、proxy_set_header1.1、<span class"katex--inline">http\_host与</span>host区别1、在使用Nginx做反向代理的时候&#xff0c;proxy_set_header功能可以设置反向代理后的http header中的host&#xff0c;1.1.1、 不设置 proxy_set_header H…

nginx学习一

nginx 安装&#xff1a; 1、 ./configure 如果报错 error: C compiler cc is not found 如果没有安装就安装:yum install –y gcc 如果还报错看看是不是安装: yum install –y zlib zlib-devel 2、 安装 make 3、 make install 4、 安装完后可以查看到目录 5、 启动 nginx …

nginx学习记录

一、docker安装nginx和配置文件 &#xff08;1&#xff09;docker拉取镜像 docker pull nginx &#xff08;2&#xff09;创建容器 # 在/root⽬录下创建nginx⽬录⽤于存储nginx数据信息 mkdir ~/nginx cd ~/nginx mkdir conf cd conf # 在~/nginx/conf/下创建nginx.conf⽂件…

尚硅谷nginx学习笔记

尚硅谷nginx学习笔记 1.nginx相关概念1.1什么是nginx&#xff1f;1.2正向和反向代理1.3负载均衡1.4动静分离 2.nginx在linux中的安装与启动3.nginx的常用命令4.nginx的配置文件5.nginx配置实例5.1反向代理准备工作5.2反向代理实例一5.3反向代理实例二5.4负载均衡实例5.5动静分离…

Nginx学习(一)

系统版本CentOS Linux release 7.6.1810 (Core) Nginx作用 反向代理正向代理负载均衡HTTP服务器(包含动静分离) 环境确认 1.关闭iptables规则 如果启动的iptables防火墙不想关闭的话&#xff0c;可以通过iptables -F 来清除防火墙关闭。然后通过iptables -L查看 2.停用seli…

NGINX学习记录-基础入门篇

学习《NGINX 经典教程》林静&#xff0c;刘旭峰&#xff0c;章澍&#xff0c;廖健雄&#xff0c;宗兆伟 ... 著 目录 一、Nginx优点 二、功能(应用场景) 反向代理。 负载均衡 静态缓存 Web服务器 安全和访问控制 三、nginx安装 四、启动、停止和重载nginx 五、配置文…

Nginx学习总结(1):Nginx简介

(最近&#xff0c;部门组织了好几个技术兴趣小组&#xff0c;对当前的热门技术进行研究。我加入了Nginx学习小组&#xff0c;与几个同事一道围绕Nginx来进行研究和学习。从今天起&#xff0c;我会陆陆续续发一系列有关Nginx的学习总结。本文是系列之一&#xff1a;Nginx简介。)…

学习nginx

Nginx笔记 安装nginxwget -c https://nginx.org/download/nginx-1.20.1.tar.gz1、创建软链路ls /usr/local/nginx/sbin/nginx /usr/bin/ 2、前端部署配置 Conf 在这里插入图片描述 3、启动服务 由于软链路 可以直接 nginx 启动&#xff08;任意目录&#xff09; 停止 nginx -s…

nginx学习日记

nginx介绍 1.什么是nginx? nginx就是c语言开发的一个高性能HTTP和反向代理Web服务器以及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器 nginx是轻量级的。 2.什么是反向代理&#xff1f; 代理服务可以简单的分为正向代理和反向代理。 正向代理&#xff1a;就是代理…