抽象工厂模式常用于程序适配多种数据库,以达到开放扩展关闭修改的原则。

首先需要有一个思想就是数据库表结构都是固定,但是每种数据库语言存在差异性,因此使用接口规范功能,各种数据库有自己不同的语言实现,业务中也是使用接口操作,运行时根据配置实例化各种数据库实现。好处是增加新的数据库时,只需要用新的数据库语言实现即可,不用修改原来的代码。部署程序时,只需要修改配置即可适配不同的数据库。

一,数据模型(Model层)

myProject/MyORM/Model/User.go
 package Model

 type User struct {
Id int
UID string
LoginName string
PassWord string
} func (t *User) TableName() string {
return "User"
}

myProject/MyORM/Model/Product.go

 package Model

 type Product struct {
Id int
UID string
Name string
Price float64
} func (t *Product) TableName() string {
return "Product"
}

二,接口定义(Interface层)

myProject/MyORM/Data/IUser.go
 package Data

 import (
"myProject/MyORM/Model"
) type IUser interface {
Add(entity *Model.User) bool
Edit(entity *Model.User) Model.User
}

myProject/MyORM/Data/IProduct.go

 package Data

 import (
"myProject/MyORM/Model"
) type IProduct interface {
Add(entity *Model.Product) bool
Edit(entity *Model.Product) Model.Product
}

myProject/MyORM/Data/IProvider.go

♥ 抽象工厂接口

 package Data

 type IProvider interface {
GetUser() IUser
GetProduct() IProduct
}

三,接口实现(DAL层)

♣ 注意:Go语言的接口实现是隐式的,无须让实现接口的类型写出实现了哪些接口。这个设计被称为非侵入式设计。在类型中添加与接口签名一致的方法就可以实现该方法。

1.SQL实现

myProject/MyORM/SqlData/SqlUser.go

 package SqlData

 import (
"fmt"
"myProject/MyORM/Model"
) type SqlUser struct {
} func (p *SqlUser) Add(entity *Model.User) bool {
fmt.Println("sql执行UserAdd")
return true
} func (p *SqlUser) Edit(entity *Model.User) Model.User {
fmt.Println("sql执行UserEdit")
return *entity
}

myProject/MyORM/SqlData/SqlProduct.go

 package SqlData

 import (
"fmt"
"myProject/MyORM/Model"
) type SqlProduct struct {
} func (p *SqlProduct) Add(entity *Model.Product) bool {
fmt.Println("sql执行ProductAdd")
return true
} func (p *SqlProduct) Edit(entity *Model.Product) Model.Product {
fmt.Println("sql执行ProductEdit")
return *entity
}

myProject/MyORM/SqlData/SqlProvider.go

♥ SQL工厂实现

 package SqlData

 import (
"myProject/MyORM/Data"
) type SqlProvider struct {
} func (p *SqlProvider) GetUser() Data.IUser {
return new(SqlUser)
} func (p *SqlProvider) GetProduct() Data.IProduct {
return new(SqlProduct)
}

2.Mysql实现

myProject/MyORM/MysqlData/MysqlUser.go

 package MysqlData

 import (
"fmt"
"myProject/MyORM/Model"
) type MysqlUser struct {
} func (p *MysqlUser) Add(entity *Model.User) bool {
fmt.Println("mysql执行UserAdd")
return true
} func (p *MysqlUser) Edit(entity *Model.User) Model.User {
fmt.Println("mysql执行UserEdit")
return *entity
}

myProject/MyORM/MysqlData/MysqlProduct.go

 package MysqlData

 import (
"fmt"
"myProject/MyORM/Model"
) type MysqlProduct struct {
} func (p *MysqlProduct) Add(entity *Model.Product) bool {
fmt.Println("mysql执行ProductAdd")
return true
} func (p *MysqlProduct) Edit(entity *Model.Product) Model.Product {
fmt.Println("mysql执行ProductEdit")
return *entity
}

myProject/MyORM/MysqlData/MysqlProvider.go

♥ MYSQL工厂实现

 package MysqlData

 import (
"myProject/MyORM/Data"
) type MysqlProvider struct {
} func (p *MysqlProvider) GetUser() Data.IUser {
return new(MysqlUser)
} func (p *MysqlProvider) GetProduct() Data.IProduct {
return new(MysqlProduct)
}

三,业务逻辑(BLL层)

myProject/MyORM/Service/Factory.go

 package Service

 import (
"myProject/MyORM/Data"
"myProject/MyORM/MysqlData"
"myProject/MyORM/SqlData"
)
// 设置配置
const db = "sql" // 简单工厂方法,根据配置加载不同的实现库
func Provider() Data.IProvider {
switch db {
case "sql":
return new(SqlData.SqlProvider)
case "mysql":
return new(MysqlData.MysqlProvider)
default:
panic("无法映射配置的数据库")
}
}

myProject/MyORM/Service/UserService.go

 package Service

 import (
"myProject/MyORM/Data"
"myProject/MyORM/Model"
) type UserService struct {
} var user Data.IUser func init() {
user = Provider().GetUser()
} func (u *UserService) Add(entity *Model.User) bool {
return user.Add(entity)
} func (u *UserService) Update(entity *Model.User) Model.User {
return user.Edit(entity)
}

myProject/MyORM/Service/ProductService.go

 package Service

 import (
"myProject/MyORM/Data"
"myProject/MyORM/Model"
) type ProductService struct {
} var product Data.IProduct func init() {
product = Provider().GetProduct()
} func (p *ProductService) Add(entity *Model.Product) bool {
return product.Add(entity)
} func (p *ProductService) Update(entity *Model.Product) Model.Product {
return product.Edit(entity)
}

四,界面展示(UI层)

myProject/MyORM/main.go

 package main

 import (
"myProject/MyORM/Model"
"myProject/MyORM/Service"
) func main() {
user := &Model.User{
Id: ,
UID: "",
LoginName: "admin",
PassWord: "",
}
userService := new(Service.UserService)
userService.Add(user) product := &Model.Product{
Id: ,
UID: "",
Name: "苹果",
Price: 12.5,
}
productService := new(Service.ProductService)
productService.Update(product)
}

学习Go语言之简易ORM框架的更多相关文章

  1. Django学习(三)---Models(ORM框架)

    1) Django 中Models是与数据库相关的,与数据库相关的代码一般写在 models.py中,Django 支持 sqlite3, MySQL, PostgreSQL等数据库,只需要在sett ...

  2. 基于Torndb的简易ORM

    ============================================================================ 原创作品,同意转载. 转载时请务必以超链接形式 ...

  3. 笔记:学习go语言的网络基础库,并尝试搭一个简易Web框架

    在日常的 web 开发中,后端人员常基于现有的 web 框架进行开发.但单纯会用框架总感觉不太踏实,所以有空的时候还是看看这些框架是怎么实现的会比较好,万一要排查问题也快一些. 最近在学习 go 语言 ...

  4. 十四、EnterpriseFrameWork框架核心类库之简易ORM

    在写本章前先去网上找了一下关于ORM的相关资料,以为本章做准备,发现很多东西今天才了解,所以在这里也对ORM做不了太深入的分析,但还是浅谈一下EFW框架中的设计的简易ORM:文中有一点讲得很有道理,D ...

  5. Android 数据库ORM框架GreenDao学习心得及使用总结<一>

    转: http://www.it165.net/pro/html/201401/9026.html 最近在对开发项目的性能进行优化.由于项目里涉及了大量的缓存处理和数据库运用,需要对数据库进行频繁的读 ...

  6. 【转载】Android开源:数据库ORM框架GreenDao学习心得及使用总结

    转载链接:http://www.it165.net/pro/html/201401/9026.html 最近在对开发项目的性能进行优化.由于项目里涉及了大量的缓存处理和数据库运用,需要对数据库进行频繁 ...

  7. 学习ORM框架—hibernate(三):跟踪持久化对象状态,掌握对象持久化

    准备工作 在上篇博客中学习ORM框架—hibernate(一):初识hibernate,通过简单的实例说明O和R的映射过程.本篇博客将要介绍hibernate中持久化对象的状态,并使用hibernat ...

  8. golang学习笔记17 爬虫技术路线图,python,java,nodejs,go语言,scrapy主流框架介绍

    golang学习笔记17 爬虫技术路线图,python,java,nodejs,go语言,scrapy主流框架介绍 go语言爬虫框架:gocolly/colly,goquery,colly,chrom ...

  9. go语言,golang学习笔记3 用命令下载框架报错问题解决 设置环境变量

    go语言,golang学习笔记3 用命令下载框架报错问题解决 设置环境变量 下载安装:go get github.com/astaxie/beego 首页 - beego: 简约 & 强大并存 ...

随机推荐

  1. BZOJ 2588 主席树

    思路: 主席树 做完BZOJ 3123 觉得这是道水啊-- 然后狂RE 狂MLE 要来数据 忘把deep[1]设成1了----------. 啊wocccccccccccccccc //By Siri ...

  2. NVMe到底是什么?

    转:http://www.expreview.com/42142.html 有关注SSD的朋友应该今年听到NVMe这个词的频率应该不低,随着高端SSD的战场已经抛弃SATA向PCI-E转移,老旧的AH ...

  3. localStorage、sessionStorage的区别

    1.localStorage生命周期是永久的, sessionStorage生命周期为当前窗口或标签页,一旦窗口或标签页被永久关闭了,那么所有通过sessionStorage存储的数据也就被清空了. ...

  4. C#如何生成一个随机种子for Random?

    就这么写: Random rand = new Random((int)DateTime.Now.Ticks); 或者这么写: Random rand = new Random(new Guid(). ...

  5. H.264标准(一)mp4封装格式详解

    在网络层,互联网提供所有应用程序都要使用的两种类型的服务,尽管目前理解这些服务的细节并不重要,但在所有TCP/IP概述中,都不能忽略他们: 无连接分组交付服务(Connectionless Packe ...

  6. sql server 更新满足条件的某一条记录

    上图数据:SNum为”18004XXXXX000001K2GW 4000 L1C“,OffLineStation为“OP1010”的有两条数据,当where条件中为上述两者时会同时更新这两条数据,并不 ...

  7. 优动漫PAINT-超简单灌木教程

    超简单灌木教程~零基础神马的都能神还原哦! 优动漫PAINT下载:http://wm.makeding.com/iclk/?zoneid=18597 想要Get到更多有关优动漫的信息包括软件下载,可关 ...

  8. 优动漫 PAINT 导航窗口面板

    导航窗口面板用于管理画布的视图.本节将介绍如何在其中缩放.旋转.翻转画布. 如何使用导航窗口面板 使用[导航窗口]面板便于把握整个画布,以下将为您详细介绍. 什么是[导航窗口]面板 [导航窗口]面板用 ...

  9. vue 键盘监听事件

    <template> <div class="hello"> <input v-on:keyup.enter="submit" t ...

  10. JavaScript设计模式(biaoyansu)(2)

    单例模式实例 (创建类模式): let elBalance = document.getElementById('balance') function init () { var a = new Di ...