设计模式中的工厂模式是我们编写代码时常用的一种建造型模式,用于创建指定类的实例。,在不使用设计模式的时候,我们是怎么创建类的实例的呢?,别多想,这个问题没坑,就是我们写代码时直接用 new 关键字,直接创建实例。比如 Java 语言里是通过 new 关键字直接调用类的构造方法,完成实例的创建。,而像 Go 语言这类,虽说是非面向对象语言,但也提供了创建类型实例指针的 new 方法。,那既然能直接 new ,有人肯定会问“那为什么还要用设计模式啊?而且听说工厂模式里边还能分出好几种工厂”。解答这个问题并不难,因为我们总是会把一些已经定型的业务处理逻辑抽象成各种项目里的公共类库,这样才能找到抓手,让产品开发形成闭环……。,上面的黑话,大家一定不要学,在公司用容易有不好的结果…我这里只是为了提升点喜感,下面用正经话再说一遍。,刚才说到了把一些执行流程明确、但流程细节有差异的业务处理逻辑抽象成公共类库。这时候一组具有相同行为的类都会实现一个固定流程的接口,但是程序里该创建哪个类的实例,提前不知道,只能是根据运行参数动态判断,在加上对于类实例化的过程我们可能需要收敛一下,这样才能保证生产出来的实例能符合我们的预期。,于是乎,聪明的你一定会想到,这时候,我让类库再暴露出一个 NewXXX 之类的方法,这个 NewXXX 方法能够根据条件生产出具体类型的实例返回给业务程序用。如果你能想到这里,恭喜你,这个时候你已经用上工厂模式了。,有时候就是这样,在写代码的时候,不知不觉地就用上设计模式了,虽然你可能还不知道。等我们把设计模式用熟后,自然就能有意识地写出更好的代码。,设计模式里工厂模式一共可以提炼成三类工厂:,这三类工厂模式的抽象度依次提高,像上面给大家举的例子,你不知不觉用上的就是“简单工厂”这种设计模式,随着这种流程定型的类库越来越复杂,要求的抽象度变高后,我们可能还会用到后面两种工厂模式。这里我就用一些例子,把这三种工厂模式给大家分析一下。,Go 语言没有构造函数一说,所以一般会定义 NewXXX 函数来初始化相关类。NewXXX 函数返回接口时就是简单工厂模式。,考虑一个简单的应用场景,这个应用场景里会提供很多语言的打印机,他们都源于一个 Printer 接口。,程序通过简单工厂向客户端提供需要的语种的打印机。,目前这个场景里我们先提供两个语种的打印机,他们都是 Printer 接口的具体实现类型。,这个场景下,工厂、产品接口、具体产品类的关系可以用下面这个图表示。,,客户端只需要告诉工厂想要哪个语种的打印机产品,工厂就会把产品给返回给客户端。,简单工厂模式主要包含3个角色。,简单工厂的优点是,简单,缺点嘛,如果具体产品扩产,就必须修改工厂内部,增加Case,一旦产品过多就会导致简单工厂过于臃肿,为了解决这个问题,才有了下一级别的工厂模式–工厂方法。,工厂方法模式(Factory Method Pattern)又叫作多态性工厂模式,指的是定义一个创建对象的接口,但由实现这个接口的工厂类来决定实例化哪个产品类,工厂方法把类的实例化推迟到子类中进行。,在工厂方法模式中,不再由单一的工厂类生产产品,而是由工厂类的子类实现具体产品的创建。因此,当增加一个产品时,只需增加一个相应的工厂类的子类, 以解决简单工厂生产太多产品时导致其内部代码臃肿(switch … case分支过多)的问题。,下面举个简单的例子来理解工厂方法的设计思想,考虑有这样一个生产计算器的工厂,每类计算器产品都由一个子工厂负责生产。,注意:Go中没有继承,所以这里说的工厂子类,其实是直接实现工厂接口的具体工厂类。,现在我们假定程序可以生产两类计算器,加法计算器和乘法计算器,也就是在工厂方法模式中,存在两个子类工厂。,这两个子类工厂分别用来生产加法和乘法计算器,,注意:这里为了理解,例子都很简单,真实场景下每个子类工厂创建产品实例的时候是可以放进去复杂逻辑的,不是简单的New一下。,这个场景下,工厂、产品接口、具体产品类的关系可以用下面这个图表示。,,类图–工厂方法,测试运行–客户端使用子类工厂创建产品实例。,工厂方法模式的优点,工厂方法模式的缺点,无论是简单工厂还是工厂方法都只能生产一种产品,如果工厂需要创建生态里的多个产品,就需要更进一步,使用第三级的工厂模式–抽象工厂。,抽象工厂模式:用于创建一系列相关的或者相互依赖的对象。,为了更清晰地理解工厂方法模式和抽象工厂模式的区别,我们举一个品牌产品生态的例子。,比如智能家居领域多家公司,现在有华为和小米,他们的工厂除了生产我们熟知的手机外,还会生产电视、空调这种家电设备。,假如我们有幸作为他们工厂智能化管理软件的供应商,在软件系统里要对工厂进行抽象,这个时候就不能再用工厂方法这种设计模式了,因为工厂方法只能用来生产一种产品。,我们先看一下使用类图表示的这个抽象工厂抽象多品牌–多产品的形态。,,类图–抽象工厂,下面我们用代码简单实现一个抽象工厂,这个工厂能生成智能电视和空调,当然产品的功能在代码里比较简单,就是输出一条相应的信息。,目前抽象工厂有两个实际工厂类一个是华为的工厂,一个是小米的工厂,他们用来实际生产自家的产品设备。,同样抽象工厂也具备工厂方法把产品的创建推迟到工厂子类去做的特性,假如未来加入了 VIVO 的产品,我们就可以通过再创建 VIVO 工厂子类来扩展。,对于抽象工厂我们可以总结以下几点:,抽象工厂模式的优点,抽象工厂模式的缺点,我们用几个较为简单的例子和大家一起学习了下三个工厂模式各自的场景和优缺点,实际使用的时候项目一开始需求还没那么明确的时候推荐还是先用简单工厂,等我们业务理解更透彻后如果确实需要再升级到工厂方法也不迟。,抽象工厂也是,如果确定引入产品生态的概念才能更好地进行领域建模,再开始使用抽象工厂也不迟。
© 版权声明
文章版权归作者所有,未经允许请勿转载。