《golang设计模式》第一部分·创建型模式-04-工厂方法模式(Factory Method)

文章目录

  • 1 概述
    • 2.1 角色
    • 2.2 类图
  • 2 代码示例
    • 2. 1 设计
    • 2.2 代码
    • 2.3 类图
  • 3. 简单工厂
    • 3.1 角色
    • 3.2 类图
    • 3.3 代码示例
      • 3.3.1 设计
      • 3.3.2 代码
      • 3.3.3 类图

1 概述

工厂方法类定义产品对象创建接口,但由子类实现具体产品对象的创建。

2.1 角色

  • Product(抽象产品):它是具体产品的抽象类,可以是结构体,也可以是接口
  • ConcreteProduct(具体产品):它实现了抽象产品接口,对应了一种具体产品
  • Factroy(抽象工厂):在抽象工厂类中声明了工厂方法,用于返回一个产品。
  • ConcreteFactory(具体工厂):实现了在抽象工厂中声明的工厂方法,并可由客户端调用,返回一个具体产品类的实例。

2.2 类图

«interface»
Product
+Get()
ConcreteProductA
+Get()
ConcreteProductB
+Get()
«interface»
Factroy
+CreateProduct()
ConcreteFactroyA
+CreateProduct() : Product
ConcreteFactroyB
+CreateProduct() : Product
Client

2 代码示例

2. 1 设计

2.2 代码

package main

import (
	"fmt"
)

type Product interface {
    Get()
}

type ConcreteProductA struct {
    Name string
	Kind string
}


func (c *ConcreteProductA) Get() {
	fmt.Printf("%+v",c)
}
type ConcreteProductB struct {
    Name string
	Kind string
}


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

type ConcreteProductC struct {
    Name string
	Kind string
}


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


type Factroy interface {
	CreateProduct(name string) Product
}

type ConcreteFactoryA struct {
}

func (f  *ConcreteFactoryA) CreateProduct(name string) Product {
	p := &ConcreteProductA{
		Name: name,
		Kind:"A",
	}
	return p
}

type ConcreteFactoryB struct {
}

func (f *ConcreteFactoryB) CreateProduct(name string) Product {
	p := &ConcreteProductB{
		Name: name,
		Kind: "B",
	}
	return p
}

type ConcreteFactoryC struct {
}

func (f *ConcreteFactoryC) CreateProduct(name string) Product {
	p := &ConcreteProductC{
		Name: name,
		Kind: "C",
	}
	return p
}

func CreateProduct(myType int64) Factroy {
	switch myType {
	case 1:
		return  &ConcreteFactoryA{}
	case 2:
		return &ConcreteFactoryB{}
	case 3:
		return &ConcreteFactoryC{}
	}
	return nil
}

func main() {
	factory := CreateProduct(1)
	product := factory.CreateProduct("nginx")
    product.Get()
}
  • 输出
&{Name:nginx Kind:A}

2.3 类图

«interface»
Product
+Get()
ConcreteProductA
+Name:string
+Kind:string
+Get()
ConcreteProductB
+Name:string
+Kind:string
+Get()
ConcreteProductC
+Name:string
+Kind:string
+Get()
«interface»
Factroy
+CreateProduct()
ConcreteFactroyA
+CreateProduct() : Product
ConcreteFactroyB
+CreateProduct() : Product
ConcreteFactroyC
+CreateProduct() : Product

3. 简单工厂

在产品结构简单的情况下,我们可以把工厂模式简化成一个简单工厂

3.1 角色

  • Product(抽象产品):它是具体产品的抽象类,可以是结构体,也可以是接口
  • ConcreteProduct(具体产品):它实现了抽象产品接口,对应了一种具体产品
  • Factroy(简单工厂):根据一个条件用于返回一个产品

去掉了具体工厂角色,产品由简单工厂直接返回。

3.2 类图

«interface»
Product
+Create()
ConcreteProductA
+Create()
ConcreteProductB
+Create()
Factroy
+CreateProduct() : Product

3.3 代码示例

3.3.1 设计

  • 定义一个抽象产品Product
  • 定义三个具体产品ConcreteProductAConcreteProductBConcreteProductC
    • 它们各自的Get()方法会访问它本身
  • 定义一个简单工厂
    • 简单工厂的CreateProduct()方法会返回一个产品
  • 调用
    • 实例化一个简单工厂
    • 用简单工厂创建一个产品
    • 用产品的Get()方法查询结果

3.3.2 代码

package main

import (
	"fmt"
)

type Product interface {
	Get()
}

type ConcreteProductA struct {
	Name string
	Kind string
}

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

type ConcreteProductB struct {
	Name string
	Kind string
}

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

type ConcreteProductC struct {
	Name string
	Kind string
}

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

type Factroy struct {
}

func (f *Factroy) CreateProduct(myType int64, name string) Product {
	switch myType {
	case 1:
		return &ConcreteProductA{
			Name: name,
			Kind: "A",
		}
	case 2:
		return &ConcreteProductB{
			Name: name,
			Kind: "B",
		}
	case 3:
		return &ConcreteProductC{
			Name: name,
			Kind: "C",
		}
	}
	return nil
}

func main() {
	factory := &Factroy{}
	product := factory.CreateProduct(1, "nginx")
	product.Get()
}

  • 输出
&{Name:nginx Kind:A}

3.3.3 类图

«interface»
Product
+Get()
ConcreteProductA
+Name
+Kind
+Cet()
ConcreteProductB
+Name
+Kind
+Get()
ConcreteProductC
+Name
+Kind
+Get()
Factroy
+CreateProduct() : Product

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/63494.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IDEA强大的VisualGC插件

前言 开发阶段实时监测,自己的JVM信息,实时可视化 Hotspot JVM 垃圾回收监控工具, 支持查看本地和远程JVM进程, 支持G1 and ZGC算法。 插件安装 在线安装 IntelliJ IDEA 可通过在线安装的方式,安装插件 JDK VisualGC,安装步骤: …

SpringBoot运行流程源码分析------阶段二(run方法核心流程)

run方法核心流程 在分析和学习整个run方法之前,我们可以通过以下流程图来看下SpringApplication调用的run方法处理的核心操作包含哪些。 从上面的流程图中可以看出,SpringApplication在run方法中重点做了以下几步操作 获取监听器和参数配置打印banner…

【C语言学习——————预处理3000字讲解】

欢迎阅读新一期的c语言学习模块————预处理 ✒️个人主页:-_Joker_- 🏷️专栏:C语言 📜代码仓库:c_code 🌹🌹欢迎大佬们的阅读和三连关注,顺着评论回访🌹&#x1f339…

防火墙第二次作业

一、什么是防火墙? 百度给出个一个定义:防火墙技术是通过有机结合各类用于安全管理与筛选的软件和硬件设备,帮助计算机网络于其内、外网之间构建一道相对隔绝的保护屏障,以保护用户资料与信息安全性的一种技术。 通俗的来讲&#…

由于找不到vcruntime140_1.dll,无法继续执行代码重新安装程序,怎么解决

vcruntime140_1.dll是Microsoft Visual C Redistributable for Visual Studio 2015中的一个动态链接库文件。它是用于支持在Windows操作系统上运行使用Visual C编写的应用程序或游戏所必需的文件之一。当出现vcruntime140_1.dll丢失的错误时,通常是由于缺少或损坏了…

《面试1v1》ElasticSearch架构设计

🍅 作者简介:王哥,CSDN2022博客总榜Top100🏆、博客专家💪 🍅 技术交流:定期更新Java硬核干货,不定期送书活动 🍅 王哥多年工作总结:Java学习路线总结&#xf…

【前端】html

HTML标签(上) 目标: -能够说出标签的书写注意规范 -能够写出HTML骨架标签 -能够写出超链接标签 -能够写出图片标签并说出alt和title的区别 -能够说出相对路径的三种形式 目录: HTML语法规范HTML基本结构标签开发工具HTML常用标…

Stable Diffusion教程(8) - X/Y/Z 图表使用

1. 介绍 这项功能可以在 文生图/图生图 界面的左下角种 “脚本” 一栏内选择 “X/Y/Z 图表” 以启用。 它创建具有不同参数的图像网格。使用 X 类型和 Y 类型字段选择应由行和列共享的参数,并将这些参数以逗号分隔输入 X 值 / Y 值字段。支持整数、浮点数和范围。…

数据结构——单链表OJ题(第二弹)

单链表OJ题 前言一、返回链表开始入环的第一个节点思路一思路二 二、返回链表的深度拷贝总结 前言 此次练习题有两道! 有点小难度,但相信难不住大家的! 我也会给出两道OJ题的链接,大家也赶快去试一试吧 一、返回链表开始入环的第…

浅聊Cesium.js 后处理原理

浅聊Cesium.js 后处理原理 使用例子: const stages viewer.scene.postProcessStages;const silhouette Cesium.PostProcessStageLibrary.createSilhouetteStage() silhouette.enabled true; stages.add(silhouette);silhouette.uniforms.color Cesium.Color.LIME;涉及到相…

OSPF作业3

题目 地址配置 R1: R2: R3: R4: R5: R6: R7: R8: R9: R10: R11: R12: 私网通及LSDB优化 R1: ospf 1 router-id 1.1.1.1 …

关于Godot游戏引擎制作流水灯

先上核心代码 游戏节点 流水灯的通途可以是 1. 装饰 2. 音乐类多媒体程序(如FL中TB-303的步进灯) FL Studio Transistor Bass

STM32基础入门学习笔记:内部高级功能应用

文章目录: 一:低功耗模式 1.睡眠模式测试程序 NVIC.h NVIC.c key.h key.c main.c 2.停机模式测试程序 main.c 3.待机模式测试程序 main.c 二:看门狗 1.独立看门狗测试程序 iwdg.h iwdg.c main.c 2.窗口看门狗测试程序 wwdg…

深入理解缓存 TLB 原理

今天分享一篇TLB的好文章,希望大家夯实基本功,让我们一起深入理解计算机系统。 TLB 是 translation lookaside buffer 的简称。首先,我们知道 MMU 的作用是把虚拟地址转换成物理地址。 MMU工作原理 虚拟地址和物理地址的映射关系存储在页表…

Go语音介绍

Go语言介绍 Go 即Golang,是Google公司2009年11月正式对外公开的一门编程语言。 Go是静态强类型语言,是区别于解析型语言的编译型语言。 解析型语言——源代码是先翻译为中间代码,然后由解析器对代码进行解释执行。 编译型语言——源代码编…

20230807通过ffmpeg将DTS编码的AUDIO音频转换为AAC编码

20230807通过ffmpeg将DTS编码的AUDIO音频转换为AAC编码 2023/8/7 20:04 ffmpeg dts 转AAC 缘起:由于网上找的电影没有中文字幕,有内置的英文字幕,但是还是通过剪映/RP2023识别一份英文字幕备用! I:\Downloads\2005[红眼航班]Red E…

【C++】Lambda表达式的使用

学习目标: 例如: 了解Lambda的优点 掌握Lambda表达式的使用 了解Lambda表达式的底层原理 学习内容: Lambda表达式的语法 文章目录 学习目标:学习内容:Lambda表达式排序案例Lambda表达式语法捕捉列表Lambda表达式模拟…

【Java设计模式】建造者模式 注解@Builder

概念 将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示。它使将一个复杂的对象分解成多个简单的对象,然后一步步构建而成。 每一个具体建造者都相对独立,而与其它的具体建造者无关,因此可以很方便地替换具…

深度学习论文: RepViT: Revisiting Mobile CNN From ViT Perspective及其PyTorch实现

深度学习论文: RepViT: Revisiting Mobile CNN From ViT Perspective及其PyTorch实现 RepViT: Revisiting Mobile CNN From ViT Perspective PDF: https://arxiv.org/pdf/2307.09283.pdf PyTorch代码: https://github.com/shanglianlm0525/CvPytorch PyTorch代码: https://gith…

【并发专题】单例模式的线程安全(进阶理解篇)

目录 背景前置知识类加载运行全过程 单例模式的实现方式一、饿汉式基本介绍源码分析 二、懒汉式基本介绍源码分析改进 三、懒汉式单例终极解决方案(静态内部类)(推荐使用方案)基本介绍源码分析 感谢 背景 最近学习了JVM之后&…