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

一、简单工厂模式

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

摘自: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()
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值