利用go多态实现一个简单工厂模式

go的多态只能用接口来实现,不能用嵌入结构体的继承方式来实现。

go的多态和java很像,结合下面代码中的例子很容易就能理解。

在下面代码中,我们定义了一个接口DatabaseConnection,代表着数据库连接。这个接口有三个具体实现:MysqlConnection 、SqlServerConnection 、OracleConnection,代表着三种不同的数据库连接。

我们创建一个工厂,工厂中的方法功能是创建一个数据库连接,根据传入参数的不同,工厂方法返回三种数据库连接其中的某一个。

因为工厂方法声明的返回值类型是接口DatabaseConnection,而其真实的返回值是三种具体实现该接口的结构体的某一种,所以这里就体现了go对多态的支持。

go 复制代码
package main

import (
	"errors"
	"fmt"
	"strings"
)

// 接口
type DatabaseConnection interface {
	doConnect()
	execSql()
}

// 接口的具体实现1
type MysqlConnection struct {
}
func (MysqlConnection) doConnect() {
	fmt.Println("Mysql数据库连接")
}
func (MysqlConnection) execSql() {
	fmt.Println("Mysql执行sql语句")
}

// 接口的具体实现2
type SqlServerConnection struct {
}
func (SqlServerConnection) doConnect() {
	fmt.Println("SqlServer数据库连接")
}
func (SqlServerConnection) execSql() {
	fmt.Println("SqlServer执行sql语句")
}

// 接口的具体实现3
type OracleConnection struct {
}
func (OracleConnection) doConnect() {
	fmt.Println("Oracle数据库连接")
}
func (OracleConnection) execSql() {
	fmt.Println("Oracle执行sql语句")
}

// 工厂
type DatabaseConnectionFactory struct {
}
// 工厂方法,参数name为需要创建的数据库连接的类型,比如mysql,oracle等等
func (DatabaseConnectionFactory) CreateDatabase(name string) (DatabaseConnection, error) {
	switch strings.ToLower(name) {
	case "mysql":
		return &MysqlConnection{}, nil
	case "oracle":
		return &OracleConnection{}, nil
	case "sqlserver":
		return &SqlServerConnection{}, nil
	}
	return nil, errors.New("no such database: " + name)
}

func main() {
	var name string
	fmt.Scan(&name) //从控制台输入想要创建的数据库类型,如mysql,oracle等等
	factory := DatabaseConnectionFactory{}
	if dc, err := factory.CreateDatabase(name); err == nil {
		dc.doConnect()
		dc.execSql()
	} else {
		fmt.Print(err.Error())
	}
}
相关推荐
布茹 ei ai几秒前
QtWeatherApp - 简单天气预报软件(C++ Qt6)(附源码)
开发语言·c++·qt·开源·开源项目·天气预报
Wpa.wk2 分钟前
自动化测试 - 文件上传 和 弹窗处理
开发语言·javascript·自动化测试·经验分享·爬虫·python·selenium
LinHenrY12273 分钟前
初识C语言(编译和链接)
c语言·开发语言·蓝桥杯
_OP_CHEN3 分钟前
【Python基础】(二)从 0 到 1 入门 Python 语法基础:从表达式到运算符的全面指南
开发语言·python
l1t4 分钟前
利用小米mimo为精确覆盖矩形问题C程序添加打乱函数求出更大的解
c语言·开发语言·javascript·人工智能·算法
我命由我1234513 分钟前
Python Flask 开发:在 Flask 中返回字符串时,浏览器将其作为 HTML 解析
服务器·开发语言·后端·python·flask·html·学习方法
csbysj202014 分钟前
Scala 类和对象
开发语言
拾忆,想起15 分钟前
设计模式:软件开发的可复用武功秘籍
开发语言·python·算法·微服务·设计模式·性能优化·服务发现
沐知全栈开发20 分钟前
HTTP/HTTPS 简介
开发语言
跟着珅聪学java21 分钟前
HTML中设置<select>下拉框默认值的详细教程
开发语言·前端·javascript