golang设计模式 工厂方法模式

171 阅读2分钟

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、总结

我们把工厂类抽出一个接口,这个接口只有一个创建抽象产品的工厂方法。所有要生产具体类的工厂,就要实现这个接口。这样一个简单工厂的工厂类,变成一个工厂抽象接口和多个具体生产对象的工厂,我们要增加一个新的逻辑运算时,就不需要改原来的工厂类了,只要增加此功能的运算类和对应的工厂类就可以了。