Golang设计模式(抽象工厂模式)

模式定义

为了更清晰地理解工厂方法模式,需要先引入两个概念:

产品等级结构 :产品等级结构即产品的继承结构,如一个抽象类是电视机,其子类有海尔电视机、海信电视机、TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,而具体品牌的电视机是其子类。
产品族 :在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,如海尔电器工厂生产的海尔电视机、海尔电冰箱,海尔电视机位于电视机产品等级结构中,海尔电冰箱位于电冰箱产品等级结构中。

抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。

模式结构

抽象工厂模式包含如下角色:

AbstractFactory:抽象工厂
ConcreteFactory:具体工厂
AbstractProduct:抽象产品
Product:具体产品
在这里插入图片描述

适用环境

在以下情况下可以使用抽象工厂模式:

一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有类型的工厂模式都是重要的。
系统中有多于一个的产品族,而每次只使用其中某一产品族。
属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来。
系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现。

代码实现

//产品等级结构 :
//产品等级结构即产品的继承结构,如一个抽象类是电视机,
//其子类有海尔电视机、海信电视机、TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,
//抽象电视机是父类,而具体品牌的电视机是其子类。

//产品族 :
//在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,
//如海尔电器工厂生产的海尔电视机、海尔电冰箱,海尔电视机位于电视机产品等级结构中,海尔电冰箱位于电冰箱产品等级结构中。

//AbstractFactory:抽象工厂
//ConcreteFactory:具体工厂
//AbstractProduct:抽象产品
//Product:具体产品

package main

import "fmt"

type Ifactory interface {
	CreateTvFactory() TvFactory
	CreateRefrigeratorFactory() RefrigeratorFactory
}

type TvFactory interface {
	CreateTV() Tv
}
type RefrigeratorFactory interface {
	CreateRefrigerator() Refrigerator
}

type Tv interface {
	Wacht()
}
type Refrigerator interface {
	GetFood()
}

type tv struct {
	Name string
}

func (t *tv) Wacht() {
	fmt.Println("watch   ", t.Name, "  Tv")
}

type refrigerator struct {
	Name string
}

func (t *refrigerator) GetFood() {
	fmt.Println(t.Name, "  GetFood ...")
}

type Factory struct {
	Name string
}

func (h *Factory) CreateTV() Tv {
	return &tv{
		Name: h.Name,
	}
}
func (h *Factory) CreateTvFactory() TvFactory {
	return h
}
func (h *Factory) CreateRefrigerator() Refrigerator {
	return &refrigerator{Name: h.Name}
}

func (h *Factory) CreateRefrigeratorFactory() RefrigeratorFactory {
	return h
}

func NewFactory(name string) Ifactory {
	return &Factory{
		Name: name,
	}
}

func main() {
	f := NewFactory("haier")

	f.CreateTvFactory().CreateTV().Wacht()
	f.CreateRefrigeratorFactory().CreateRefrigerator().GetFood()

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值