一、简单工厂模式
简单工厂模式属于创建型模式又叫做静态工厂方法模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。
简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。摘自:https://www.jianshu.com/p/5cb52d84bd6d
// 定义一些共同元素和方法
type Shape struct {}
// 产品需要实现的接口
type ShapeInterface interface {
Show()
}
// 产品1
type Circle struct {
Shape
}
func (c *Circle) Show() {
fmt.Println("Circle")
}
// 产品2
type Triangle struct {
Shape
}
func (t *Triangle) Show() {
fmt.Println("Triangle")
}
// 产品3
type Line struct {
Shape
}
func (t *Line) Show() {
fmt.Println("Line")
}
// 工厂类,负责创建具体对象
type ShapeFactory struct {}
func (f *ShapeFactory) CreateShape(shapeType string) ShapeInterface {
switch shapeType {
case "c":
return &Circle{}
case "l":
return &Line{}
case "t":
return &Triangle{}
default:
fmt.Println("Not support shape : "+shapeType)
return nil
}
}
func simpleFactoryMethod() {
factory := ShapeFactory{}
shape := factory.CreateShape("c")
shape.Show()
shape = factory.CreateShape("t")
shape.Show()
shape = factory.CreateShape("l")
shape.Show()
}
二、工厂模式
简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。
但是当需要添加类时,还要在基类中添加判断逻辑,违反了开放-封闭原则。
工厂方法模式(Factory Method),定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。[DP]
优点与缺点
工厂方法克服了简单工厂违背开放封闭原则的缺点,又保持了封装对象创建过程的优点。它们都是集中封装了对象的创建,使得要更换对象时,不需要做大的改动就可实现,降低了客户程序与产品对象的耦合。工厂方法模式是简单工厂模式的进一步抽象和推广。
由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。但缺点是由于每加一个产品,就需要加一一个产品工厂的类,增加了额外的开发量。
仔细观察还会发现,工厂方法模式实现时,把简单工厂的内部逻辑判断移到了客户端代码来进行。想要加功能时,本来是改工厂类的,现在是修改客户端。
// 定义一些产品的共同元素和方法
type Shape struct {}
// 产品需要实现的接口
type ShapeInterface interface {
Show()
}
// 定义一些工厂的共同元素和方法
type Factory struct {}
// 工厂需要实现的接口
type FactoryInterface interface {
CreateShape() ShapeInterface
}
// 产品1
type Circle struct {
Shape
}
func (c *Circle) Show() {
fmt.Println("Circle")
}
// 产品1的工厂类
type CircleFactory struct {
Factory
}
func (f *CircleFactory) CreateShape() ShapeInterface {
return &Circle{}
}
// 产品2
type Triangle struct {
Shape
}
func (t *Triangle) Show() {
fmt.Println("Triangle")
}
// 产品2的工厂类
type TriangleFactory struct {
Factory
}
func (f *TriangleFactory) CreateShape() ShapeInterface {
return &Triangle{}
}
func main() {
var factory FactoryInterface
factory = &CircleFactory{}
shape := factory.CreateShape()
shape.Show()
factory = &TriangleFactory{}
shape = factory.CreateShape()
shape.Show()
}