工厂模式（factory Method）的本质是什么？为什么引入工厂模式？
其实设计模式那本书里面没有一个工厂模式，没记错的话是有一个抽象工厂模式，那个就比较具体了（这也是我想吐槽的，这么具体的模式具名有毛用）。  其实工厂模式上面 @大宽宽 的答案就很好了，不过你既然想要问本质到底是什么？那么我给个简单的答案…… 工厂模式的本质就是对获取对象过程的抽象。  当然这么一句话你肯定是不满意的，要解释这句话，我们就要谈谈，抽象是什么。 不过我打算讲另外一个被无数程序员挂在嘴边但实际上没几个人真正能搞懂的玩意儿：面向接口编程。通过面向接口编程，我们可以知道这句话里面的抽象到底是什么。  我们来看一个例子，小李今天入职了一家公司，上司交给他一个复杂的任务，但是考虑到篇幅的问题，我们用一个更简单的任务来代替。上司是这样说的，你写一个东西，接受一条消息，生成一个唯一标识，然后把消息和标识写到一个数据表里面。 功能非常简单，但是绝大多数程序员接到这个任务的时候，满头都是问号…… 怎么生成一个唯一标识？有没有规则和限制？存到什么数据库里面？数据库连接字符串是什么？数据库在哪里？用什么东西访问数据库？ 同样因为篇幅的问题，我们假装小李顿悟了消息就是一个byte[]。  小李带着这一堆问题去问主管，主管的答案也很简单和干脆，你不用管。 小李写程序十年了，得到这个答案一脸懵逼，憋了一上午，啥玩意儿都没写出来，因为他完全不知道从什么地方下手来完成这个非常简单的任务。  而事实上，这个任务要完成的代码也非常之简单，简单到你看到就想骂人的程度（当然这也是因为考虑到篇幅）。 完事，  标准的，可运行的，完美的C#代码，编译，0 error，一次通过。绝对不是只能看不能用的伪代码。  这就是面向接口编程的真正含义，本质上，我们不需要关注的部分，都是接口，接口就是抽象，就是规约。我们要完成某个任务，将所有所需要的前提条件都抽象成规约，然后写成接口。然后我们就可以把代码完成了，至于这些接口怎么实现，并不是完成这个任务所必需的。  ------------------------------不知道从哪里冒出来的分隔线------------------------------  眼尖的朋友们很快就看出来了，这段代码好像和工厂模式没有任何关系。那么接下来，我们就让他和工厂产生一些关系。 突然主管像想起什么事儿一样的，回过头来跟小李说：你就存到一个叫Messages的表里面就好了，里面就俩字段，一个string的ID，一个byte[]的消息内容叫做Message。  然后小李表示，哎呀，除了表的名字，其他的东西我都未卜先知了呢，然后唰唰的就把代码改成了这样：   随着越来越多的小李和抄小李代码的程序员的出现，这种和IDataAccesserFactory长得差不多的类型越来越多，终于被人发现和总结，得到了一个牛逼的名字：工厂模式。