简单工厂模式、工厂方法模式和抽象工厂模式有何区别？
工厂模式我个人认为其实比较难理解的，如果有接触过|听过|见过该模式的同学很可能就会想：我自己new一个对象出来就好了，简单快捷。用得着你这个工厂模式吗？搞一个工厂出来还要写一大堆的代码呢~ 网上的很多资料都是在阐述着：工厂模式的好处就是解耦。相信大家对解耦这个词也不陌生，那解耦究竟有什么好处呢？ 本文章试图去解释为什么要用工厂模式，用了工厂模式的好处是什么，以及工厂模式衍生出的三种形式究竟有什么区别~~ 那么接下来就开始吧，如果有错的地方希望能多多包涵，并不吝在评论区指正！ 在《设计模式之禅》这本书中分了两章节讲工厂模式： 网上的大部分资料都是将工厂模式分成三种： 看完上面的叙述是不是想打死我，什么鸟玩意？不急哈，下面我会一一讲到~~ 想想我们为什么要用工厂模式？下面我就简单举例子： 文件IO的操作我们会经常用得到吧，所以BufferedReader对象经常要创建的： 你说麻烦吗？其实也不麻烦，就一行代码嘛，哪里麻烦了~如果不太熟悉IO流的同学就没有那么机灵了，创建一个BufferedReader可能就是以下的代码了： 你说麻烦吗？其实也不麻烦，不就是三行代码嘛，哪里麻烦了~如果这个应用很多的类上都用到了BufferedReader对象的话，那每个类都写上这三行代码了。那你说麻烦吗？那肯定麻烦啊，还用想啊.... 可以看出来，创建一个BufferReader对象里面需要一个FileReader对象，而FileReader对象又要File对象。那创建这个BufferReader对象还是比较麻烦的(代码上看不麻烦，从构造上看还是挺麻烦的)！ 虽然比较麻烦，但我们还能用，能用就行！于是乎，我们就去写代码了，现在有三个类都要进行文件的读写操作，于是他们就有这样的代码：   此时：上头说，我要换成LineNumberReader来读写，有这个需求！那我们作为一个写代码的，能怎么办？很绝望也需要去完成呀。 哎，写个代码屁事真多...那有没有一种方法能够让创建对象变得简单而且修改对象时能很方便呢？ 再说从面向对象的角度来看：我一个操作文件的类还要我会创建BufferReader是不是有点过分了？(职责没有分工好) 何为工厂？将我们的产品都交由工厂来生产！我现在用的iphone5s，从哪来？从富士康组装而来，富士康是工厂。我用得着知道iphone5s在富士康是怎么组装起来的吗？不需要。 来，我们来改造一下上面的例子。首先我们创建一个工厂类，它可以生产Reader对象！ 那么我们要得到BufferReader对象就贼简单了： 工厂将我们创建的对象过程给屏蔽了！ 此时我要改成LineNumberReader怎么玩？在工厂上改一下就好了：   我们的调用方FileOperateA|FileOperateB|FileOperateC这些类完全就不用变！ 从上面的工厂模式体验我们就可以看到：  这就是解耦的好处！ 我再放下我之前练习的时候写过的代码吧： 我有一个DaoFactory，逻辑很简单就是专门创建Dao对象的~   那么在Service层就可以使用工厂将想要的Dao对象初始化了~   此时我们的Service与Dao的对象低耦合的~ 在Service与Controller层我也弄了一个ServiceFactory，根据当时业务的需要(添加权限)，我创建Service时就非常灵活了：   在一开始我就说了，工厂模式可以分成三类： 下面我就逐一来介绍一下每一种工厂模式有什么不一样~ 三种模式都以：Java3y要买宠物的例子来讲解~ 很多博客都是以简单/静态工厂模式，工厂方法模式，抽象工厂模式这个顺序来讲解工厂模式的。我认为按书上的顺序比较好理解~因为简单/静态工厂模式是在工厂方法模式上缩减，抽象工厂模式是在工厂方法模式上再增强。 Java3y每天写代码很无聊，想要买只宠物来陪陪自己。于是乎就去宠物店看宠物啦~~~ 作为一间宠物店，号称什么宠物都有！于是乎，店主宣传的时候就说：我的宠物店什么宠物都有！ 于是构建宠物的工厂就诞生了~ 当然了，主流的宠物得进货一些先放在店里充充门面，一些特殊的宠物就告诉顾客要时间进货~ 猫工厂： 狗工厂也是一样的： 嗯，还有我们的实体类：猫、狗、动物(多态：猫和狗都是动物，可以直接用动物来表示了) 动物实体类： 猫实体类： 狗实体类： 那么现在Java3y想要一只狗，跟了宠物店老板说，宠物店老板就去找狗回来了： 那么现在Java3y想要一只猫，跟了宠物店老板说，宠物店老板就去找猫回来了： 如果这个时候Java3y说想要一只蜥蜴怎么办啊？没问题啊，店主搞个蜥蜴工厂就好了~~ 优点: 缺点: 工厂方法类图：   现在宠物店生意不好做啊，号称“什么宠物都有",这吹过头了~~于是店主只卖两种常见的宠物了。 所以我们的工厂是这样子的： 三个实体还是没变(动物、猫、狗).... 那么Java3y去宠物店买猫狗的时候，告诉老板我要猫、我要狗： 现在问题来了: 简单工厂类的优点也很明显：我就一个具体的工厂来创建对象，代码量少。 抽象工厂模式就比较复杂了，我们一般的应用都写不到。我首先来简述一下需求吧：  那我们的猫和狗都是有性别的，不是公的就是母的~~ 具体的代码是这样的： 我们的最大工厂还是定义了创建什么动物 创建母猫和母狗的工厂： 创建公猫和公狗的工厂： 这是所有动物都拥有的普遍行为： 这是猫都拥有的普遍行为： 这是狗都拥有的普遍行为： 猫分为公猫、母猫。狗分为公狗和母狗： .....   简单来说：工厂方法模式的工厂是创建出一种产品，而抽象工厂是创建出一类产品。   效果：   这是抽象工厂模式的类图：   抽象工厂模式说到底就是多了一层抽象，减少了工厂的数量。 抽象工厂缺点也很明显：  总的来说我们用简单工厂模式比较多，工厂方式模式的话代码量会比较大，抽象工厂模式的话需要业务比较大的情况下才会用到(如果有更好的理解方式不妨在评论区留言，一起交流交流涨涨见识~~)  参考资料： 更多设计模式文章： Java3y号内有海量的视频资源和原创的思维导图，关注即可获取！ 有帮助？点赞！