《大话设计模式》简单工厂模式与工厂模式

一、简单工厂模式

简单工厂模式属于创建型模式又叫做静态工厂方法模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。
简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

摘自: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()
}

猜你喜欢

转载自blog.csdn.net/unirrrrr/article/details/104146709
今日推荐