Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >23种设计模式(2):工厂方法模式

23种设计模式(2):工厂方法模式

作者头像
全栈程序员站长
发布于 2022-07-09 02:28:03
发布于 2022-07-09 02:28:03
19500
代码可运行
举报
运行总次数:0
代码可运行

定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。

类型:创建类模式

类图:

工厂方法模式代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
interface IProduct {
	public void productMethod();
}

class Product implements IProduct {
	public void productMethod() {
		System.out.println("产品");
	}
}

interface IFactory {
	public IProduct createProduct();
}

class Factory implements IFactory {
	public IProduct createProduct() {
		return new Product();
	}
}

public class Client {
	public static void main(String[] args) {
		IFactory factory = new Factory();
		IProduct prodect = factory.createProduct();
		prodect.productMethod();
	}
}

工厂模式:

首先须要说一下工厂模式。工厂模式依据抽象程度的不同分为三种:简单工厂模式(也叫静态工厂模式)、本文所讲述的工厂方法模式、以及抽象工厂模式。工厂模式是编程中经经常使用到的一种模式。它的主要长处有:

  • 能够使代码结构清晰,有效地封装变化。在编程中,产品类的实例化有时候是比較复杂和多变的,通过工厂模式,将产品的实例化封装起来,使得调用者根本无需关心产品的实例化过程,仅仅需依赖工厂就可以得到自己想要的产品。
  • 对调用者屏蔽详细的产品类。假设使用工厂模式,调用者仅仅关心产品的接口就能够了,至于详细的实现,调用者根本无需关心。即使变更了详细的实现,对调用者来说没有不论什么影响。
  • 减少耦合度。产品类的实例化通常来说是非常复杂的,它须要依赖非常多的类,而这些类对于调用者来说根本无需知道,假设使用了工厂方法,我们须要做的仅仅是实例化好产品类,然后交给调用者使用。对调用者来说,产品所依赖的类都是透明的。

工厂方法模式:

通过工厂方法模式的类图能够看到,工厂方法模式有四个要素:

  • 工厂接口。工厂接口是工厂方法模式的核心,与调用者直接交互用来提供产品。在实际编程中,有时候也会使用一个抽象类来作为与调用者交互的接口,其本质上是一样的。
  • 工厂实现。在编程中,工厂实现决定怎样实例化产品,是实现扩展的途径,须要有多少种产品,就须要有多少个详细的工厂实现。
  • 产品接口。产品接口的主要目的是定义产品的规范,全部的产品实现都必须遵循产品接口定义的规范。产品接口是调用者最为关心的,产品接口定义的优劣直接决定了调用者代码的稳定性。相同,产品接口也能够用抽象类来取代,但要注意最好不要违反里氏替换原则。
  • 产品实现。实现产品接口的详细类,决定了产品在client中的详细行为。

前文提到的简单工厂模式跟工厂方法模式极为相似,差别是:简单工厂仅仅有三个要素,他没有工厂接口,而且得到产品的方法通常是静态的。由于没有工厂接口,所以在工厂实现的扩展性方面稍弱,能够算所工厂方法模式的简化版,关于简单工厂模式,在此一笔带过。

适用场景:

无论是简单工厂模式,工厂方法模式还是抽象工厂模式,他们具有类似的特性,所以他们的适用场景也是类似的。

首先,作为一种创建类模式,在不论什么须要生成复杂对象的地方,都能够使用工厂方法模式。有一点须要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是仅仅须要通过new就能够完毕创建的对象,无需使用工厂模式。假设使用工厂模式,就须要引入一个工厂类,会添加系统的复杂度。

其次,工厂模式是一种典型的解耦模式,迪米特法则在工厂模式中表现的尤为明显。假如调用者自己组装产品须要添加依赖关系时,能够考虑使用工厂模式。将会大大减少对象之间的耦合度。

再次,因为工厂模式是依靠抽象架构的,它把实例化产品的任务交由实现类完毕,扩展性比較好。也就是说,当须要系统有比較好的扩展性时,能够考虑工厂模式,不同的产品用不同的实现工厂来组装。

典型应用

要说明工厂模式的长处,可能没有比组装汽车更合适的样例了。场景是这种:汽车由发动机、轮、底盘组成,如今须要组装一辆车交给调用者。假如不使用工厂模式,代码例如以下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Engine {
	public void getStyle(){
		System.out.println("这是汽车的发动机");
	}
}
class Underpan {
	public void getStyle(){
		System.out.println("这是汽车的底盘");
	}
}
class Wheel {
	public void getStyle(){
		System.out.println("这是汽车的轮胎");
	}
}
public class Client {
	public static void main(String[] args) {
		Engine engine = new Engine();
		Underpan underpan = new Underpan();
		Wheel wheel = new Wheel();
		ICar car = new Car(underpan, wheel, engine);
		car.show();
	}
}

能够看到,调用者为了组装汽车还须要另外实例化发动机、底盘和轮胎,而这些汽车的组件是与调用者无关的,严重违反了迪米特法则,耦合度太高。而且很不利于扩展。另外,本例中发动机、底盘和轮胎还是比較详细的,在实际应用中,可能这些产品的组件也都是抽象的,调用者根本不知道如何组装产品。假如使用工厂方法的话,整个架构就显得清晰了很多。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
interface IFactory {
	public ICar createCar();
}
class Factory implements IFactory {
	public ICar createCar() {
		Engine engine = new Engine();
		Underpan underpan = new Underpan();
		Wheel wheel = new Wheel();
		ICar car = new Car(underpan, wheel, engine);
		return car;
	}
}
public class Client {
	public static void main(String[] args) {
		IFactory factory = new Factory();
		ICar car = factory.createCar();
		car.show();
	}
}

使用工厂方法后,调用端的耦合度大大减少了。而且对于工厂来说,是能够扩展的,以后假设想组装其它的汽车,仅仅须要再添加一个工厂类的实现就能够。不管是灵活性还是稳定性都得到了极大的提高。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/119259.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021年11月,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
工厂方法模式
简单定义### 定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。 工厂方法(Factory Method)模式的意义### 是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。 核心精神### 是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到
张俊怡
2018/04/24
5410
工厂方法模式
设计模式(八):工厂方法模式
定义用于创建对象的接口,让子类决定创建哪个类的实例。工厂方法允许类的实例化延迟到子类。
xujjj
2019/07/12
3940
设计模式(八):工厂方法模式
23种设计模式之工厂方法模式
定义: 定义一个用于创建对象的接口,让子类决定实例化哪一个类. 工厂方法使一个类的实例化延迟到其子类
烟草的香味
2019/07/25
3420
聊聊设计模式之工厂方法模式
定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。
Bug开发工程师
2018/07/23
3630
聊聊设计模式之工厂方法模式
工厂模式
  定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。
那一叶随风
2018/09/27
3640
工厂模式
设计模式学习笔记(三)简单工厂、工厂方法和抽象工厂之间的区别
设计模式中的工厂模式(Factory Design pattern)是一个比较常用的创建型设计模式,其中可以细分为三种:简单工厂(Simple Factory)、工厂方法(Factory Method)和抽象工厂(Abstract Factory)。那么三者有什么区别呢?先说结论:
归思君
2023/10/16
3.1K0
设计模式学习笔记(三)简单工厂、工厂方法和抽象工厂之间的区别
设计模式之工厂方法模式
工厂方法模式(Factory Method Pattern) 隶属于设计模式中的创建型模式,前面的简单工厂模式是工厂方法模式的简化版,因此两者在很多方面都是相似的。
Dylan Liu
2019/08/07
4260
java设计模式之工厂模式
1 它是一个具体的类,非接口 抽象类。有一个重要的create()方法,利用if或者 switch创建产品并返回。
BUG弄潮儿
2022/06/30
2450
java设计模式之工厂模式
大牧絮叨设计模式:工厂方法模式
工厂方法模式是一种创建模式,又被称为虚拟构造子模式(Virtual Constructor)或者多态性工厂模式(Polymoriphoic Factory)。工厂方法模式是目标是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。
大牧莫邪
2019/07/16
4130
大牧絮叨设计模式:工厂方法模式
Java二十三种设计模式-工厂方法模式(2/23)
在软件开发中,工厂方法模式是一种常用的创建型设计模式,它用于处理对象的创建,将对象的实例化推迟到子类中进行。这种模式不仅简化了对象的创建过程,还提高了代码的可维护性和可扩展性。
正在走向自律
2024/12/18
1310
Java二十三种设计模式-工厂方法模式(2/23)
设计模式之工厂模式
将选择实现类、创建对象统一管理和控制。从而将调用者跟我们的实现类解耦。 实例化对象,用工厂方法代替new操作。
时间静止不是简史
2020/07/24
4240
设计模式之工厂模式
Java面试专题之五:设计模式学习,详细分析工厂方法模式
工厂模式主要是为创建对象提供了接口。工厂模式按照《Java与模式》中的提法分为三类: 1. 简单工厂模式(Simple Factory) 2. 工厂方法模式(Factory Method) 3. 抽象工厂模式(Abstract Factory)
用户1289394
2020/11/06
3740
Java面试专题之五:设计模式学习,详细分析工厂方法模式
工厂方法模式
工厂方法模式(Factory Method),定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。 ——《设计模式:可复用面向对象软件的基础》
mingmingcome
2021/11/29
2350
工厂方法模式
【设计模式】第三篇:一篇搞定工厂模式【简单工厂、工厂方法模式、抽象工厂模式】
之前讲解 Spring 的依赖注入的文章时,我们就已经有提到过工厂这种设计模式,我们直接先通过一个例子来看一下究竟工厂模式能用来做什么?
BWH_Steven
2020/11/10
3840
【设计模式】第三篇:一篇搞定工厂模式【简单工厂、工厂方法模式、抽象工厂模式】
一起学习设计模式--03.工厂方法模式
简单工厂模式虽然简单,但是存在一个很严重的问题:由于静态工厂方法是根据传入的参数不同来创建不同的产品的,所以当系统中需要引入新产品时,就需要修改工厂类的源代码,这将违背开闭原则。为了实现增加新产品而不修改原有代码,工厂方法模式应运而生。
独立观察员
2022/12/06
4520
一起学习设计模式--03.工厂方法模式
23种设计模式之工厂三兄弟
关于设计模式,是一个永远说不完的也说不清的话题。毕竟在编程的世界里,没有最好的设计模式,只有最合适的设计模式。甚至有些时候,程序或者问题不到一定的规模,尝试所有的设计模式都是花架子。另外,在程序设计之初就谈论设计模式有些为时过早,但在问题出现之后才想起来设计模式却有为时已晚,毕竟后期代码的重构或者逻辑的优化都不是一件轻轻松松就能完成的事情。所以,在合适的地方在合适的时机使用合适的设计模式,恰好能体现出来一个开发者的优秀程度。 设计模式就像是武功的套路,每一个套路都有固定的招式。而每一个套路也不是万能的,不同的套路解决不同的问题。初学武功的人,只能以模仿的方式一招一式的练习,而大师级别的武术宗师心中却不受这些套路的桎梏。长时间的习武,反反复复的练习,早就把这些套路深深的印在了骨子里。必要的时候,就能不经思考的下意识出招。同理,深刻理解并经常应用设计模式的开发者,遇到问题的时候,可以熟练的筛选出来合适的设计模式。甚至有些时候,他们还可以把这些设计模式进行组合或者进行一些改造,来达到更好的效果,无招胜有招,心中无模式却胜过有模式,这大概就是设计模式的最高境界。
VV木公子
2018/08/13
7.1K0
23种设计模式之工厂三兄弟
工厂方法模式
工厂方法模式Factory Method Pattern又称为工厂模式,也叫虚拟构造器Virtual Constructor模式或者多态工厂Polymorphic Factory模式,它属于类创建型模式,在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。
WindRunnerMax
2020/09/14
3810
工厂方法模式
上文描述了简单工厂模式,但是简单工厂模式并不属于23种设计模式。所以本文我们介绍简单工厂模式的高级实现。在此之前先看一下简单工厂模式所存在的问题。预留问题:
乱敲代码
2020/05/21
3450
工厂方法模式浅析
在平时的应用开发中,工厂模式是比较常用的一个设计模式,基本上在很多的开源jar中可以看到工厂设计模式的影子。
孟君
2020/07/16
4550
『设计模式』工厂方法模式
每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。
风骨散人Chiam
2020/10/28
4430
相关推荐
工厂方法模式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验