-
Notifications
You must be signed in to change notification settings - Fork 19
抽象工厂模式:抽象工厂模式和工厂模式有区别吗?
提供一个创建产品族的接口,其每个子类可以生产一系列相关的产品。
特别强调了一下抽象工厂模式的概念理解部分我觉得是非常有必要的,当然我在写下这篇文章之前看过很多优秀的博文、书籍、视频等资料对抽象工厂模式的讲解和代码示例等内容,但我发现。抽象工厂的概念被一次又一次的刷新,所以我也想表达一下自己对抽象工厂的理解。如果你和我持不同的意见,可以继续往下看,我很愿意和你一起讨论这个问题。
看我过之前的文章应该知道了我写的工厂模式的概念和代码实现,以及使用的时机。而抽象工厂模式的实现,等于工厂方法模式的实现。
那为什么会有两个模式的定义出现呢?这个问题解决了,那我们的概念就捋清楚了。我们一起来回顾一下这两个模式的定义:
- 工厂(Factory)模式:定义一个用于创建产品的接口,由子类决定生产什么产品。
- 抽象工厂(AbstractFactory)模式:提供一个创建产品族的接口,其每个子类可以生产一系列相关的产品。
我们将上面的两个模式的定义放在一起总结一下,是不是可以认为是,首先定义一个工厂接口,由子类去实现具体的工厂。如果我总结的定义你可以认可,那继续往下看。不认可忍一忍,看完再喷。让我们通过代码在理解一下。
❗下面内容很关键,希望你能认真看完。当然,不建议死扣字眼和代码,还是最初的那个誓言,学习设计模式的思想。而不是学语文。
/**
* 电子工厂
*/
public interface ElectronicsFactory {
/**
* 生产一个手机
*/
Phone creatPhone();
}
/**
* 苹果手机电子工厂
*/
public class IphoneElectronicsFactory implements ElectronicsFactory{
/**
* 生产一个苹果手机
*/
Phone creatPhone() {
return new IPhone()
}
}
/**
* 小米手机电子工厂
*/
public class MiPhoneElectronicsFactory implements ElectronicsFactory{
/**
* 生产一个苹果手机
*/
Phone creatPhone() {
return new MiPhone()
}
}
/**
* 电子工厂
*/
public interface ElectronicsFactory {
/**
* 生产一个手机
*/
Phone creatPhone();
/**
* 生产一个电脑
*/
Computer creatComputer();
}
/**
* 苹果电子工厂
*/
public class AppleElectronicsFactory implements ElectronicsFactory{
/**
* 生产一个苹果手机
*/
Phone creatPhone() {
return new IPhone()
}
/**
* 生产一个苹果电脑
*/
Computer creatComputer() {
return new MACBook();
}
}
/**
* 小米电子工厂
*/
public class MiElectronicsFactory implements ElectronicsFactory{
/**
* 生产一个小米手机
*/
Phone creatPhone() {
return new MiPhone()
}
/**
* 生产一个小米电脑
*/
Computer creatComputer() {
return new MiComputer();
}
}
我们通过工厂方法模式,可以得到各种各样的同类型产品(都是手机),但我们如果通过抽象工厂模式,就可以得到各种各样同个产品族的产品(一个品牌的所有产品)而这一切的内容,仅仅相差了一行代码 。同样的,当抽象工厂中只有一个工厂时,它与工厂模式,没有什么不同。
工厂方法模式只考虑生产同等级的产品,抽象工厂模式将考虑多等级产品的生产,将同一个具体工厂所生产的位于不同等级的一组产品称为一个产品族(品牌)
完整代码及单元测试结果 https://github.com/lvgocc/java-design-patterns/tree/main/abstract-factory
代码在上面已经罗列过,这里就不在赘述,需要的同学可以移步上面链接。可以的话,给个star吧(脸皮厚的不行)
抽象工厂与工厂方法模式为同一种设计思想,他们不同于简单工厂。因为看了很多资料,对这部分内容的描述各有千秋。所以我在这里也表达了自己的一些看法。参考内容感兴趣的小伙伴可以看一下,我们一起讨论一下是极好的
- http://c.biancheng.net/view/1351.html
- https://www.journaldev.com/1392/factory-design-pattern-in-java
- https://www.journaldev.com/1418/abstract-factory-design-pattern-in-java
再回到上面的两个定义:
- 工厂(Factory)模式:定义一个用于创建产品的接口,由子类决定生产什么产品。
- 抽象工厂(AbstractFactory)模式:提供一个创建产品族的接口,其每个子类可以生产一系列相关的产品。
抽象工厂,比如’富士康‘,细品一下,他就有多个产品族,此时你应该明白了抽象工厂的概念和与工厂方法模式的区别(相差一行代码,相差一个产品族),如果被我说晕了,我真的很抱歉,愿意的话可以与我私聊。
当然相差一行代码是为了表达两者直接的关系,在实际应用情况下还是遵循标准的命名规范。避免产生歧义,出现理解误差。
文末的JDK中的抽象工厂设计模式示例生产的就是一个系列,所以上面也提到了抽象工厂与工厂本身并无大差别,当你一个工厂可以生产出多个系列的产品的时候,其实他就是抽象工厂了。比如看过我上一篇工厂模式文章的小伙伴就会发现,文末给出的 JDK 例子使用的是静态工厂模式。这一次给出的是抽象工厂(工厂方法模式)。抽象工厂与工厂方法本是同根生。我知道我把你说绕了,但是我的初衷是让你清楚这两者(抽象工厂模式与所谓的工厂方法模式),本就是一个思想。
🔔如果觉得我没说明白的请联系我,非常乐意被打扰
如果上面星尘表述的内容没能讲清楚抽象工厂的概念,大家不要急。继续往下看。如果我说的还不明白,给我个机会,加我微信(lvgocc)或者公众号内私聊,直到聊清楚为止。你若不会,我愿受累,为了你,我愿意执着🐱💻。
- 当你想要管理多个系列产品的时候,比如多个套餐?多种策略组合?看你需求,合理使用,总之多系列就用它!
例如你有一套方法,在不同的操作系统需要使用不同的实现,那这个时候你就可以使用抽象工厂,可以让它在不同的操作系统下发挥不同的功能。
案例来源:https://www.journaldev.com/1418/abstract-factory-design-pattern-in-java
- javax.xml.parsers.DocumentBuilderFactory#newInstance()
- javax.xml.transform.TransformerFactory#newInstance()
- javax.xml.xpath.XPathFactory#newInstance()
MI
2. 原型模式:啥?盗图、盗文章的人居然用的是一种设计模式!原型模式?
8. 桥接模式:这个不常用的设计模式居然被我学的最透,草率了!
9. 适配器模式:今天轻松点,就说说什么是“榫”,什么是“卯”,什么是“榫卯”!
10. 外观模式:书生的家书是谁送的?书童到底是个什么角色?
11. 享元模式:如果让你开发英雄联盟的兵线,你会怎么设计?
14. 模板方法模式:你知道AQS它是干什么的吧,那这个框架是怎么设计的呢?
16. 责任链模式:“张三为了纪念王二请假的悲催经历想出来的一种设计模式”
19. 命令模式:如果把请求变成一个对象,在一些场景更好用!
20. 状态模式:从工作状态,再到订单状态一点点深入学习状态模式
21. 中介者(Mediator)模式:定义一个中介对象来简化原有对象之间的交互关系,降低系统中对象间的耦合度,使原有对象之间不必相互了解。
23. 解释器(Interpreter)模式:提供如何定义语言的文法,以及对语言句子的解释方法,即解释器。