设计模式之工厂三剑客
谈及设计模式,大多数人首先会想到工厂模式,但是,工厂模式到底是啥?以及简单工厂模式、工厂方法模式、抽象工厂模式之间的区别是什么?恐怕,就很少有人说的清了!
今天,说说自己对工厂模式的一些浅见!我们先了解各个模式的定义及其使用场景,最后对三种模式进行比较分析。
1 简单工厂模式
1.1 定义
简单工厂,提供一个创建对象的功能,而无需关心该对象的具体实现。
1.2 设计初衷
一句话:给你鸡蛋吃,请不要问我是哪只鸡生的!简单工厂和它所创建的对象通常在一个包内,对象的结构组成对简单工厂是可见,但对客户端(client)而言,它是不清楚对象结构的,只需要通过简单工厂拿到对象,并使用它。
1.3 简单工厂结构说明
2 工厂方法模式:Golang不需要它
2.1 定义
工厂方法模式的主要功能是让父类在不知道具体实现的情况下,完成自身的功能调用;而具体的实现延迟到子类中来实现。
2.2 设计初衷
我不关心你是谁,你只要跟着我的指挥棒转动即可。工厂方法模式中的父类定义了转动逻辑,而其子类则通过工厂方法制定了转动执行者。
工厂方法模式很好地体现了“依赖倒置原则”,要依赖抽象,不要依赖于具体类。
2.3 工厂方法模式结构
2.4 Golang实现工厂方法模式
在我看来,用Golang实现工厂方法,就是脱裤子放屁,Operate函数直接操作Product即可,无需定义Creator类。
问题:为什么Operate要以函数形式存在,而不是Creator的方法呢?
答:Golang没有继承,虽然能通过匿名成员(嵌入结构体)实现继承功能,但匿名成员却拿不到factoryMethod产生的ConcreteProduct。
2.5 Golang为什么不需要工厂方法?
在Java中,函数是寄存在类内的,因此必须定义一个父类来实现Operate方法;而在Golang中,函数是在结构体之外的,Operate无需寄存于结构体中。
3 抽象工厂模式
3.1 定义
抽象工厂模式,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体实现。
3.2 设计初衷
你无法在肯德基喝可口可乐!与其说,抽象工厂是封装一组相互依赖对象的接口,倒不如说,抽象工厂是限定了相互依赖对象的接口组合种类,比如,同样是快餐抽象工厂,它只会有“肯德基+百事可乐”和“麦当劳+可口可乐”两种具体工厂。
3.3 抽象工厂模式结构
3.4 抽象工厂模式的调用顺序
3.5 Golang中抽象工厂,是不是与工厂方法一样,多此一举呢?
NO!抽象工厂提供多个产品的创建接口,所以,创建工厂类,就不再是多此一举,因为,脱裤子不再是放屁一件事情,还可以做其他的事情(脑补一下,画面太污)。
4 比较
本文分享自微信公众号 - DevOps技术说(sli4book)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。






