Go 之基础速学 (十一) golang 里简单工厂模式
简单工厂模式:
基本特性:
1.“掩盖”new过程
2.会有一个工厂类,且一般有个方法接受参数,根据参数来决定实例化什么类
在Go 之基础速学 (十) golang 里接口的实现 这篇文章当中我们讲到接口的实现方式发现如下代码:
var service services.IService = new(services.IServiceOne) fmt.Println(service.Get(12)) var serviceTow services.IService = &services.IServiceTwo{} fmt.Println(serviceTow.Get(13))
new(services.IServiceOne)以及&services.IServiceTwo{}频繁的使用是不是很难看啊,其实今天我们讲到的是为了让代码更加的规范化管理,更加舒适合理,当然你也可以不这么做,但是下边要讲到的可能对小白比较有用,牵扯到其他的几个知识要点
//main.go文件 package main import ( "com.huxiaobai/services" "fmt" "github.com/pquerna/ffjson/ffjson" ) func main(){ //接口的实现 (简单工厂模式的实现) 案例一 //下边两个一起的 要么通过&符号传递内存地址进去 也就是指针 要么通过new也是获取到的内存指针 效果是一样的 //var serviceFc services.IService = (&services.ServiceFactory{}).Create("one") //var serviceFc services.IService = new(services.ServiceFactory).Create("one") //这种方式是通过调用一个普通函数获取返回 return &ServiceFactory{} 的指针来实现的 是为了彻底的保证你看不到new关键字的存在 var serviceFc services.IService = services.NewServiceFactory().Create("one") fmt.Println(serviceFc.Get(123)) }
//IService.go文件: package services //就这么简单 声明接口 interfacetype IService interface { Get(id int) string } //简单工厂模式 结构体 type ServiceFactory struct { } //简单工厂模式结构体里面的方法 要求传入的是指针类型 返回的是接口类型 func (sf *ServiceFactory) Create(name string) IService { switch name { case "one": return &IServiceOne{} case "two": return &IServiceTwo{} default: return nil } } //普通函数 要求返回的是指针类型 func NewServiceFactory() *ServiceFactory { //要么通过new 要么通过&符号获取内存地址也就是指针来返回 //return new(ServiceFactory) return &ServiceFactory{} }
//IServiceOne文件: package services type IServiceOne struct { } func (one *IServiceOne) Get(id int) string { return "单挑新闻内容one" }
//IServiceTwo文件: package services type IServiceTwo struct { } func (two *IServiceTwo) Get(id int) string { return "单挑新闻内容two"; }
主要看代码里面的注释,看不懂我也没办法的啦!
本作品采用《CC 协议》,转载必须注明作者和本文链接