抽象工厂模式是工厂模式(简单工厂、工厂方法)中最具抽象和一般性的一种形态。抽象工厂模式可以向客户端提供一个接口, 使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。
抽象工厂模式的定义:为创建一组相关或相互依赖的对象提供一个接口,且无须指定它们的具体类。
同产品等级是同一类产品,同产品族的产品是由一个工厂生成的。
抽象工厂模式使用时,一般具有如下特点:
●系统中有多个产品族,每个具体工厂负责创建同一族但属于不同产品等级(产品种类)的产品
●系统一次只能消费某一族产品,即相同产品族的产品是一起被使用的当系统需要新增一个产品族时,只需要增加新的工厂类即可,无需修改源代码;但是如果需要产品族中增加一个新种类的产品时,则所有的工厂类都需要修改。
抽象工厂模式中的抽象工厂类的职责就是定义每个工厂要实现的功能,即定义多个产品族的产品的创建。这里,同一产品族下有多个产品时,对应的抽象工厂就会有多个抽象方法用来提供创建这些产品的接口。
抽象工厂-般包含四种角色,分别是:
●抽象工厂(Abstract Factory) :提供了创建产品的接口,包含多个创建产品的方法,即包含多个类似new Product 0的方法;
●具体工厂(Concrete Factory) :实现抽象工厂定义的接口,完成某个具体产品的创建;
●抽象产品(Abstract Product) :抽象产品定义,-般有多少抽象产品,抽象工厂中就包含多少个创建产品的方法;
●具体产品. (Concrete Product) :抽象产品的实现类。
实现抽象产品所定义的接口,和具体工厂是多对一的关系:
美的和TCL都会生产TV和空调,这时候,美的和TCL就是两个产品族,TV和空调就是两个产品等级,按照上面的类图照葫芦画瓢就能得到如下的类图。
import "fmt"
// 最抽象的一个工厂接口
type Factory interface {
NewTV() Television
NewRefrigerator() Refrigerator
}
// 两个工厂都有的产品的接口
type Television interface {
DoSomething()
}
type Refrigerator interface {
DoSomething()
}
// TCL 工厂
type TCLTV struct {
}
func (TCLTV) DoSomething () {
fmt.Println("TCL电视在Do Something")
}
type TCLRef struct {
}
func (TCLRef) DoSomething () {
fmt.Println("TCL空调在do something")
}
type TCLFactory struct {
}
func (TCLFactory) NewTV () Television {
return TCLTV{}
}
func (TCLFactory)NewRefrigerator () Refrigerator {
return TCLRef{}
}
// 美的工厂
type MediaTV struct {
}
func (MediaTV)DoSomething() {
fmt.Println("美的电视在do something")
}
type MediaRef struct{}
func (MediaRef)DoSomething() {
fmt.Println("美的空调在do something")
}
type MediaFactory struct {
}
func (MediaFactory) NewTV () Television {
return MediaTV{}
}
func (MediaFactory)NewRefrigerator () Refrigerator {
return MediaRef{}
}
// 客户端测试
var (
factory Factory
)
// 这里不管是TCL工厂还是美的工厂,因为他们都实现了Factory的接口,
// 所以这两个类都可以直接当做Factory对象来直接使用。
factory = &TCLFactory{}
ref := factory.NewRefrigerator()
ref.DoSomething()
tv := factory.NewTV()
tv.DoSomething()
factory = MediaFactory{}
ref = factory.NewRefrigerator()
ref.DoSomething()
tv = factory.NewTV()
tv.DoSomething()
TCL空调在do something
TCL电视在Do Something
美的空调在do something
美的电视在do something
假如某天,需要加入海尔的TV和空调,那么只需要对这里做出如下修改就可以了。