《golang设计模式》第一部分·创建型模式-04-抽象工厂模式(Abstract Factory)

这篇具有很好参考价值的文章主要介绍了《golang设计模式》第一部分·创建型模式-04-抽象工厂模式(Abstract Factory)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 概述

在不具体指定产品类的情况下,为相互关联的产品簇或产品集提供创建接口,并向客户隐藏具体产品创建的细节或表示的对象。

1.1 角色

  • AbstractFactory(抽象工厂):它声明了一组用于创建产品的方法,每一个方法对应一种产品。
  • ConcreteFactory(具体工厂):它实现了在抽象工厂中声明的创建产品的方法,生成一组具体产品,这些产品构成了一个产品族。
  • AbstractProduct(抽象产品):它为每种产品声明接口,在抽象产品中声明了产品所具有的业务方法。
  • ConcreteProduct(具体产品):它定义具体工厂生产的具体产品对象,实现抽象产品接口中声明的业务方法。

1.2 类图

2. 代码示例

2.1 设计

有冰箱和电视两种商品,但是我们创建的时候需要从另一个维度来分类——它的品牌。因此我们以西蜀牌和东吴牌分别创建两个具体工厂,每个具体工厂负责创建自己品牌的冰箱和电视。

  • 定义抽象产品冰箱
    • 定义具体产品西蜀牌冰箱
      • 它有品牌产品类型温度三个成员
      • 它的SetBrand()SetType()SetTemperature()三个方法分别负责设置以上三个成员
      • 它的Get()方法获取它本身的信息
    • 定义具体产品东吴牌冰箱
      • 它有品牌产品类型温度三个成员
      • 它的SetBrand()SetType()SetTemperature()三个方法分别负责设置以上三个成员
      • 它的Get()方法获取它本身的信息
  • 定义抽象产品电视
    • 定义具体产品西蜀牌电视
      • 它有品牌产品类型分辨率三个成员
      • 它的SetBrand()SetType()SetPPI()三个方法分别负责设置以上三个成员
      • 它的Get()方法获取它本身的信息
    • 定义具体产品东吴牌电视
      • 它有品牌产品类型分辨率三个成员
      • 它的SetBrand()SetType()SetPPI()三个方法分别负责设置以上三个成员
      • 它的Get()方法获取它本身的信息
  • 定义抽象工厂
    • 定义具体工厂西蜀工厂
      • 它的方法SetFridge设置具体产品冰箱
      • 它的方法SetTV设置具体产品电视
    • 定义具体工厂东吴工厂
      • 它的方法SetFridge设置具体产品冰箱
      • 它的方法SetTV设置具体产品电视
  • 定义一个函数CreateFactory(),用来创建具体工厂
  • 调用
    • CreateFactory()函数实例化 西蜀工厂
    • factory1实例化西蜀牌冰箱西蜀牌电视,并查看结果
    • CreateFactory()函数实例化 东吴工厂
    • factory2实例化东吴牌冰箱东吴牌电视,并查看结果

2.2 代码

package main

import "fmt"

// 定义抽象产品——冰箱
type Fridge interface {
	SetBrand(brand string)
	SetType(productType string)
	SetTemperature(temperature int64)
	Get()
}

// 定义实际产品蜀国牌冰箱
type FridgeShu struct {
	Brand       string
	ProductType string
	Temperature int64
}

func (c *FridgeShu) SetBrand(brand string) {
	c.Brand = brand
}

func (c *FridgeShu) SetType(productType string) {
	c.ProductType = productType
}

func (c *FridgeShu) SetTemperature(temperature int64) {
	c.Temperature = temperature
}

func (c *FridgeShu) Get() {
	fmt.Printf("%+v\n", c)
}

// 定义实际产品东吴牌冰箱
type FridgeWu struct {
	Brand       string
	ProductType string
	Temperature int64
}

func (c *FridgeWu) SetBrand(brand string) {
	c.Brand = brand
}

func (c *FridgeWu) SetType(productType string) {
	c.ProductType = productType
}

func (c *FridgeWu) SetTemperature(temperature int64) {
	c.Temperature = temperature
}

func (c *FridgeWu) Get() {
	fmt.Printf("%+v\n", c)
}

// 定义第二个抽象产品电视机
type TV interface {
	SetBrand(brand string)
	SetType(productType string)
	SetPPI(ppi string)
	Get()
}

// 定义西蜀牌电视机
type TVShu struct {
	Brand       string
	ProductType string
	PPI         string
}

func (c *TVShu) SetBrand(brand string) {
	c.Brand = brand
}

func (c *TVShu) SetType(productType string) {
	c.ProductType = productType
}

func (c *TVShu) SetPPI(ppi string) {
	c.PPI = ppi
}

func (c *TVShu) Get() {
	fmt.Printf("%+v\n", c)
}

// 定义东吴牌电视机
type TVWu struct {
	Brand       string
	ProductType string
	PPI         string
}

func (c *TVWu) SetBrand(brand string) {
	c.Brand = brand
}

func (c *TVWu) SetType(productType string) {
	c.ProductType = productType
}

func (c *TVWu) SetPPI(ppi string) {
	c.PPI = ppi
}

func (c *TVWu) Get() {
	fmt.Printf("%+v\n", c)
}

// Factory部分

// 定义抽象工厂
type Factory interface {
	SetFridge(temperature int64) Fridge
	SetTV() TV
}

// 定义具体工厂——西蜀工厂
type FactoryShu struct {
}

func (f *FactoryShu) SetFridge(temperature int64) Fridge {
	a := &FridgeShu{}
	a.SetBrand("蜀")
	a.SetTemperature(temperature)
	a.SetType("冰箱")
	return a
}

func (f *FactoryShu) SetTV() TV {
	p := &TVShu{}
	p.SetBrand("蜀")
	p.SetType("电视")
	p.SetPPI("8k")
	return p
}

// 定义具体工厂——东吴工厂
type FactoryWu struct {
}

func (f *FactoryWu) SetFridge(temperature int64) Fridge {
	a := &FridgeWu{}
	a.SetBrand("蜀")
	a.SetTemperature(temperature)
	a.SetType("冰箱")
	return a
}

func (f *FactoryWu) SetTV() TV {
	p := &TVWu{}
	p.SetBrand("蜀")
	p.SetType("电视")
	p.SetPPI("4k")
	return p
}

// 写一个创建工厂的函数
func CreateFactory(pType int64) Factory {
	switch pType {
	case 1:
		return &FactoryShu{}
	case 2:
		return &FactoryWu{}
	}
	return nil
}

func main() {
	shuFactory := CreateFactory(1)
	shuFactory.SetFridge(4).Get()
	shuFactory.SetTV().Get()

	wuFactory := CreateFactory(2)
	wuFactory.SetFridge(5).Get()
	wuFactory.SetTV().Get()
}

  • 输出
&{Brand:蜀 ProductType:冰箱 Temperature:4}
&{Brand:蜀 ProductType:电视 PPI:8k}       
&{Brand:蜀 ProductType:冰箱 Temperature:5}
&{Brand:蜀 ProductType:电视 PPI:4k}   

2.3 类图


《golang设计模式》第一部分·创建型模式-04-抽象工厂模式(Abstract Factory),架构设计,golang,设计模式,抽象工厂模式,架构设计,Go语言,Abstract文章来源地址https://www.toymoban.com/news/detail-623260.html

到了这里,关于《golang设计模式》第一部分·创建型模式-04-抽象工厂模式(Abstract Factory)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 模拟第一部分5

    1、如果想要在外部包中使用全局变量,则全局变量必须( ) 正确答案:A A、首字母必须大写 B、首字母必须小写 C、必须加上const D、必须加上var 答案解析:在函数体外声明的变量称之为全局变量。全局变量声明必须以 var 开头,如果想要在外部包中使用

    2024年02月08日
    浏览(48)
  • 第一部分:核心容器

    Spring就是一个轻量级的控制反转(IOC)和面向切面编程(AOP)的框架!         什么是IoC、IoC容器、bean、DI ? IoC:对象创建控制权由程序转移到IoC容器的控制反转思想。 IoC容器:创建管理对象的容器。 bean:IoC容器中被创建管理的对象。 DI:IoC容器中建立bean之间依赖关

    2024年02月13日
    浏览(46)
  • 6.播放音频(第一部分)

    这一章将对播放音频的具体内容做讲解。我的想法是按照tinyalsa中的例子作为讲解的范本,因为tinyalsa足够简单,很多时候都忽略了它的细节。趁着这个机会再整理一下tinyalsa的内容。我使用的tinyalsa从https://github.com/tinyalsa/tinyalsa下载,从examples/writei.c开始。 其中函数read_file从

    2023年04月08日
    浏览(39)
  • MySQL学习-第一部分

    MySQL数据库 MySQL是一个**关系型数据库管理系统****,**由瑞典[MySQL AB](https://baike.baidu.com/item/MySQL AB/2620844) 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用

    2024年02月15日
    浏览(52)
  • 第一部分:Spark基础篇

    第一部分:Spark基础篇_奔跑者-辉的博客-CSDN博客 第二部分:Spark进阶篇_奔跑者-辉的博客-CSDN博客 第三部分:Spark调优篇_奔跑者-辉的博客-CSDN博客 第一部分:Flink基础篇_奔跑者-辉的博客-CSDN博客 (*建议收藏*) 实时数仓之 Kappa 架构与 Lambda 架构_奔跑者-辉的博客-CSDN博客(*建议收

    2024年02月05日
    浏览(49)
  • 第一部分-基础篇-第一章:PSTN与VOIP(下篇)

      学习资料来源《FreeSWITCH权威指南》-作者杜金房这本书。我是2022年6月毕业的,偶然的机会接触到FreeSWITCH,但是目前在南京从事java后端开发,FreeSWITCH纯属个人爱好,进行笔记整理。也一直希望有机会可以参与FreeSWITCH相关工作开发,如有需要,请联系我18956043585,先说声谢

    2024年02月06日
    浏览(57)
  • HTML学习 第一部分(前端学习)

    参考学习网站: 网页简介 (w3schools.com) 我的学习思路是:网站+实践+视频。 视频很重要的,因为它会给你一种开阔思路的方式。你会想,噢!原来还可以这样。这是书本或者网站教程 所不能教给你的。而且,对一些教程,它的用法你可能 在工作或者以后都用不上,这种情况下

    2024年02月15日
    浏览(51)
  • Mysql入门基础教程(第一部分)

    MySQL基础教程解释了一些基本的SQL语句。如果这是您第一次使用关系数据库管理系统,本教程将为您提供使用MySQL数据库服务器所需的一切,例如查询数据,更新数据,管理数据库和创建表。 如果您已经熟悉其他关系数据库管理系统(如PostgreSQL,Oracle或Microsoft SQL Server等),

    2024年04月14日
    浏览(40)
  • 学成在线项目开发技巧整理---第一部分

    视频项目链接: 学成在线 整理的是我个人认为偏生疏的知识点,不一定涉及的全面。 在系统中某些选项是几个特定的值的一个或多个,并且随着还可以动态添加。比如支付方式,配送方式等。 此时我们应该设计一个数据字典模块,在后台进行管理,然后前台要从后端查询。并

    2023年04月22日
    浏览(60)
  • 字符串---第一部分 序列、字串;上升,公共

    第一部分 最长上升子序列,最长上升子串,最长公共子序列,最长公共子串--dp 第二部分 KMP,trie,双指针 第三部分 待定 动态规划:审题,状态确定,状态转移,边界条件 线性DP 最长上升子序列 403 线性DP 最长上升子序列【动态规划】_哔哩哔哩_bilibili 给定一个无序整数数组

    2024年02月07日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包