Skip to content

Commit

Permalink
完成《工厂方法模式》
Browse files Browse the repository at this point in the history
  • Loading branch information
971230 committed Dec 7, 2024
1 parent 60aff26 commit 53803fb
Show file tree
Hide file tree
Showing 10 changed files with 204 additions and 14 deletions.
2 changes: 1 addition & 1 deletion docs/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ hide:
<h1></h1>
<div style="text-align: center;" class="main-guide">
<br><br>
<h1 style="font-weight: bold">欢迎来到 Loong 的博客</h1>
<h1 style="font-weight: bold">欢迎来到 RiverLong 的博客</h1>

<span style="font-weight: 500">作者龙江风,97年出生于浙江桐庐,男</span>
<br><br><br><br><br>
Expand Down
10 changes: 5 additions & 5 deletions docs/开始阅读/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,12 @@ hide:

!!! Abstract "观前阅读"
这是博客核心内容,都是技术相关的知识点,写一些日常的博客技术积累。
其中代码样例有一些属于自己早些年还没有开始写博客的时候,很早就积累的,出于那里早就不知道了
其中代码样例有一些属于自己早些年还没有开始写博客的时候,很早就积累的,出自哪里早就不知道了
本来想标记出来哪些样例是别人的,哪些是自己写的,可是写着写着连自己也搞不清楚了,所以只做这样一个说明了。
我是觉得写博客的话和日常积累不一样,出处很重要,你平常积累的怎么copy都可以,知识是第一位,
我是觉得写博客的话和自己平常的日常积累谢谢知识点不一样,写博客出处很重要,你平常积累的怎么copy都可以,知识是第一位,
而博客具有分享、传播的性质,「原创性、知识产权、诚信、尊重、创新」,它就很重要。
本人技术不行,但我的博客里面的文字理解都是纯自己写的,有一些概念性的、理论性的,别人可能说的更好,我自己也会复制一下,
有引用的话我都会标注。
至于有没有人看,别人如何评价就随他去吧。
本人技术虽然技术不行,但我的博客里面的文字理解都是纯自己写的,有一些概念性的、理论性的,别人可能说的更好,我自己也会复制一下,
有引用的话我也都会标注。至于有没有人看,别人如何评价就随他去吧。

- <a class="navigation" href="技术研究/">一、技术研究</a>
- [x] <a class="navigation" href="技术研究/线程池批量插入大量数据/">线程池批量插入大量数据</a>
Expand All @@ -35,6 +34,7 @@ hide:
- [x] <a class="navigation" href="设计模式/模板方法模式/">模板方法模式</a>
- [x] <a class="navigation" href="设计模式/责任链模式/">责任链模式</a>
- [x] <a class="navigation" href="设计模式/观察者模式/">观察者模式</a>
- [x] <a class="navigation" href="设计模式/工厂方法模式/">工厂方法模式</a>
- <a class="navigation" href="数据库/">四、数据库</a>
- [x] <a class="navigation" href="数据库/Mysql笔记/">Mysql笔记</a>
- <a class="navigation" href="运维相关/">五、运维相关</a>
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
21 changes: 13 additions & 8 deletions docs/开始阅读/设计模式/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,12 @@ icon: simple/libreofficeimpress

# 设计模式

!!! Abstract "摘要"
!!! Abstract "我对设计模式的理解"
写一些Java技术相关的设计模式,使用Java代码样例理解,理论少一些,代码就是一种语言,它自己会说话。
我介绍设计模式大致从是什么,为什么,怎么做三个大方向上写。
同时我又觉得设计模式这种东西,仁者见仁智者见智,没有绝对的好坏,只有它适合的场景,你用不用的好
是一种能力,你实战的时候能不能判断出某一种设计模式可能会适合你的这个业务,这也是一种能力,
你写代码有没有有意识的去使用?有没有强搬其实完全没必要
是一种能力,你实战的时候能不能判断出某一种设计模式到底适不适合你的这个业务,这也是一种能力,
你写代码有没有有意识的去使用?有没有强搬但是其实它完全没必要用

我周围有相当一部分同事,认为设计模式其实也就那样,虽然可以写出花来,真的场景要用到设计模式的时候寥寥无几,
甚至有这样的情况,意识到这里可以用、很合适用,
Expand All @@ -19,17 +20,21 @@ icon: simple/libreofficeimpress
这是一种情况。

还有就是有一些程序员对于技术的那种追求,有一点像孔乙己的那件长衫,过于吹捧神话设计模式的功能,
很爱用,哪里都要用一下,结果功能不能按时做出来,
很爱用,哪里都要用一下,结果功能不能按时做出来,代码还不那么让人看得懂,
是不是要反思一下代码写的好看真的重要么?你用设计模式真的有必要么?

那在遇到这两种情况后,我能反思得到什么?现在的很多项目,都是屎山,当你看到屎山的时候,
你明知有一种方式可以让代码简单一点,松耦合,你会动么?理论终归是理论,现实是复杂的,
那么在遇到这两种情况后,我们能反思得到什么?现在的很多项目,都是屎山,当你看到屎山的时候,
你明知有一种方式可以让代码简单一点,松耦合,可以发挥设计模式真正的威力的时候,你会动手改造么?理论终归是理论,现实是复杂的,
我也只能尽量保证自己在能吃饱饭的前提下把代码写好,这才是我这个普通程序员能做的最现实的举动。
所谓高山仰止,景行行止,虽不能往,然心向往之,我想这个“往”,其实也没那么重要。
所谓高山仰止,景行行止,虽不能往,然心向往之,我想这个“往”,其实重不重要,完全看你。
别人做了你可以欣赏他的勇敢与责任,别人没有做也不用在心里默默地去苛责他的懒惰。毕竟写代码到底只是一份工作。

所有设计模式开篇的图片来自于 <u>[Refactoring.Guru](https://refactoringguru.cn/)</u>

- <a class="navigation" href="策略模式/">① 策略模式</a>
- <a class="navigation" href="建造者模式/">② 建造者模式</a>
- <a class="navigation" href="单例模式/">③ 单例模式</a>
- <a class="navigation" href="模板方法模式/">④ 模板方法模式</a>
- <a class="navigation" href="责任链模式/">⑤ 责任链模式</a>
- <a class="navigation" href="观察者模式/">⑥ 观察者模式</a>
- <a class="navigation" href="观察者模式/">⑥ 观察者模式</a>
- <a class="navigation" href="工厂方法模式/">⑦ 工厂方法模式</a>
184 changes: 184 additions & 0 deletions docs/开始阅读/设计模式/工厂方法模式.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,184 @@
---
title: 工厂方法模式
description: 介绍工厂方法模式
---

# 工厂方法模式

![图片的样式](./img/factory-method-zh-2x.png)

## ➊先介绍一下工厂方法模式

这个名字的样子,一看就是需要去创造东西,工厂工厂🏭,生产东西才是一个工厂的作用。那么工厂方法是要生产什么呢?
没错,就是对象,它是创建型模式的一种。对象的创建为什么这么重要?Java作为面向对象语言的典范,没有对象就是没有运行的基础。

### 1️⃣首先工厂方法,一定要有工厂和产品两个大头

按照业内标准都是接口或抽象类,都是需要有具体的实现的,不然没有具体的功能。

=== "定义工厂的生产标准"

```java
/**
* 定义抽象工厂类,用于生产图形。
*/
public abstract class ShapeFactory {
/**
* 创建图形的类,一定需要被子类继承,不然工厂生产了个寂寞。
*/
public abstract Shape createShape();
}
```

=== "定义产品的功能标准"

```java
/**
* 你要生产的东西的接口,在这里定义产品的功能,也就是对象要做的事情的标准。
*/
public interface Shape {
void draw();
}
```

### 2️⃣你要生产的东西的实现

其实就是你要创建的对象有哪些,现在一个个写出来,功能改加的加,要做的事情在这里做,加很多功能后,在new。

=== "圆形对象"

```java
/**
* 一般一个对象的功能有很多,还有各种属性和参数
*/
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("正在画圆");
}
}
```

=== "矩形对象"

```java
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("正在画矩形");
}
}
```

=== "正方形对象"

```java
public class Square implements Shape {
@Override
public void draw() {
System.out.println("正在画正方形");
}
}
```

### 3️⃣接下来就是提供工厂的具体生产过程了

这个生产过程demo代码很简单,具体怎么创建,也要根据具体的业务和需求来做抉择,而一般框架的实现都是会复杂很多。


=== "圆形工厂"

```java
/**
* 生产圆的工厂
*/
public class CircleFactory extends ShapeFactory {
@Override
public Shape createShape() {
return new Circle();
}
}
```

=== "矩形工厂"

```java
/**
* 生产矩形的工厂
*/
public class RectangleFactory extends ShapeFactory {
@Override
public Shape createShape() {
return new Rectangle();
}
}
```

=== "正方形工厂"

```java
/**
* 生产正方形的工厂
*/
public class SquareFactory extends ShapeFactory {
@Override
public Shape createShape() {
return new Square();
}
}
```

### 4️⃣怎么用

就是你要用那个对象就去创建哪一个就可以了, 指定了哪一个实现,工厂就开始生产对应的对象。
当然demo太简单 ,不大容易体现它的一些好处。

```java
public static void main(String[] args) {
// 创建各自的工厂去生产图形
ShapeFactory circleFactory = new CircleFactory();
ShapeFactory rectangleFactory = new RectangleFactory();
ShapeFactory squareFactory = new SquareFactory();

Shape circle = circleFactory.createShape();
Shape rectangle = rectangleFactory.createShape();
Shape square = squareFactory.createShape();

circle.draw();
rectangle.draw();
square.draw();
}
```

## ➋我们为啥要用它?
在创建对象的过程中,就有种种的麻烦,比如你要关心怎么创建,创建什么对象,有时候你都不知道创建的对象到底是啥,
那么工厂方法模式就是一种可以不关心创建过程的,不关心创建对象具体类型的一种设计模式,至于它的代码复用,啥“开闭原则”,
就有点理论和八股文了,好像设计模式多少都沾一点这些好处。简单来说就是你只管去创建对象吧,你只用下单,其它的交给工厂就行,
作为调用者来说,几乎只有一行代码就可以完成对象创建,new对象不也是一行?但是那么多的对象所携带的功能呢,人家给你写好了。

## ➌利弊权衡
工厂方法模式也不是万能的,正如多数设计模式一样,它会增加系统的复杂度,啥意思?就是你写了好多类,一个一个看很烦,而且看懂它,
我还要花时间,后面维护我还要耗费精力,这个权衡完全看你自己。而且这个模式它在创建对象的时候,只能创建一些简单的对象,涉及到多个步骤或依赖关系,
他就不大行,可能需要引入别的设计模式了,比如建造者模式。然后就是工厂方法模式一般都有接口,你要去创建对象,一般使用的接口的方法,
如果需要访问具体产品类中的特殊方法或属性,就需要进行类型转换,这可能会引入一些不便,这个就特别需要注意,看看你要创建的对象,
到底是不是会出现这种情况。

## ➍一些经典实现介绍

### 1️⃣BeanFactory
那么遇到具体的场景了,怎么看怎么判断?确实只要经验了,说再多就不如自己去写写,用用,到底啥是啥。比如:Spring框架中,
`BeanFactory`,这个够经典了吧 ,他就是工厂方法的一种,是spring创建对象的工厂,容器中的对象都是它创建的。
像里面的`getBean`有很多重载入的方法,用于获取对象,它的设计思想完全可以看看它的注释,很多很多。它的实现类太多了。

![图片的样式](./img/func/BeanFactoryImpl.png)

### 2️⃣SqlSessionFactory
还有就是MyBatis创建sqlSession的工厂类`SqlSessionFactory`,它的一个实现`DefaultSqlSessionFactory`
里面就是具体生产数据库会话的方法了。其他的一个`openSession()`也是,但是框架嘛,为了功能多会封装好多的重载方法,
归根还是图里两个方法在做事情。而且这里还有一个`SqlSessionManager`,还用到了建造者模式来解决工厂模式只能生产简单对象的缺点。

![图片的样式](./img/func/SqlSessionFactory.png)

![图片的样式](./img/func/openSession.png)

![图片的样式](./img/func/DefaultSqlSessionFactory.png)
1 change: 1 addition & 0 deletions mkdocs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,7 @@ nav:
- 模板方法模式: 开始阅读/设计模式/模板方法模式.md
- 责任链模式: 开始阅读/设计模式/责任链模式.md
- 观察者模式: 开始阅读/设计模式/观察者模式.md
- 工厂方法模式: 开始阅读/设计模式/工厂方法模式.md
- 数据库:
- 开始阅读/数据库/index.md
- Mysql笔记: 开始阅读/数据库/Mysql笔记.md
Expand Down

0 comments on commit 53803fb

Please sign in to comment.