1、描述
和简单工厂模式一样,属于创建型模式。
定义一个用于创建对象的接口,让子类决定实例化哪一个类。
不再由一个工厂创建所有的实例,而是由一堆实现了工厂接口的具体工厂去创建具体的实例,每个工厂只能创建自己的实例。
2、实现
//操作类接口
type Operator interface {
Operate(int, int) int
}
//加操作的类
type AddOperator struct {}
func (*AddOperator)Operate(a int, b int) int{
return a + b
}
//减操作的类
type SubOperator struct {}
func (*SubOperator)Operate(a int, b int) int{
return a - b
}
//创建操作工厂的接口
type OperatorFactory interface {
GetOperator() Operator
}
//创建加操作的工厂类
type AddOperatorFactory struct {}
func (*AddOperatorFactory)GetOperator() Operator{
return &AddOperator{}
}
//创建减操作的工厂类
type SubOperatorFactory struct {}
func (*SubOperatorFactory)GetOperator() Operator{
return &SubOperator{}
}
func main() {
var operatorFactory OperatorFactory
operatorFactory = &AddOperatorFactory{}
fmt.Println(operatorFactory.GetOperator().Operate(1,3))
operatorFactory = &SubOperatorFactory{}
fmt.Println(operatorFactory.GetOperator().Operate(1,3))
}
//定义文件类接口
type IBaseFile interface {
IsSMSType() bool
IsPayType() bool
DownLoadFile()
}
//定义文件基本信息类
type BaseFile struct {
Uri string
Temp string
Content string
}
func (f *BaseFile)DownLoadFile() {
f.Content = ""
}
//实现产品(文件)类
type CsvFile struct {
BaseFile
}
func (*CsvFile)IsSMSType() bool {
fmt.Println("csv file is sms type...")
return true
}
func (*CsvFile)IsPayType() bool {
fmt.Println("csv file is pay type...")
return true
}
type ExeclFile struct {
BaseFile
}
func (*ExeclFile)IsSMSType() bool {
fmt.Println("execl file is sms type...")
return true
}
func (*ExeclFile)IsPayType() bool {
fmt.Println("execl file is pay type...")
return true
}
//定义工厂类
type FileFactory struct {
}
func (c *FileFactory)CreateCsv() IBaseFile {
return &CsvFile{}
}
func (c *FileFactory)CreateExecl() IBaseFile {
return &ExeclFile{}
}
func main() {
var filefactory FileFactory
csvFile := filefactory.CreateCsv()
csvFile.DownLoadFile()
csvFile.IsSMSType()
csvFile.IsPayType()
execlFile := filefactory.CreateExecl()
execlFile.DownLoadFile()
execlFile.IsSMSType()
execlFile.IsPayType()
}
3、总结
我们把工厂类抽出一个接口,这个接口只有一个创建抽象产品的工厂方法。所有要生产具体类的工厂,就要实现这个接口。这样一个简单工厂的工厂类,变成一个工厂抽象接口和多个具体生产对象的工厂,我们要增加一个新的逻辑运算时,就不需要改原来的工厂类了,只要增加此功能的运算类和对应的工厂类就可以了。