golang设计模式
工厂模式
注意:别人的讲解上来就是代码,我这种跟本没有概念的人完全看不懂好吧。那我记录的方式就很明显跟其他人不一样喽。
首先讲讲我理解的工厂方法:
通俗的说,就是任意的工厂实例可以通过调用一样的方法来创建任意需要工厂创建的实例。
仔细思考上面这句话。
我们要注意的有几点:
- 任意工厂实例调用通一个方法------说明我所有的工厂实例都会继承同一个创建方法借口。
- 既然创建的同一(拿手机举例)物品的实例-------说明我们返回一个手机实例,并且所有的手机实例也要继承同一个接口。
为什么说所有的实例要继承同一接口呢,因为为了满足不同手机厂商的需求,我们返回的实例不可能相同,但是别忘记了,我们继承了通一借口的手机实例是都可以赋值给接口的。
所以我们只要返回手机继承的接口,就可以返回不同的手机实例了。
于是就有了工厂接口:
type Factory interface{
// 工厂都继承这个接口,创建审手机实例来,返回值用手机接口接收
CreatePhone()Phone
}
手机接口:
type Phone interface {
PhoneAbility()
}
具体操作:
//创建两个制造手机的工厂:
type (
IPhoneFactory struct{}
XiaoMiFactory struct{}
)
//创建手机实例
type(
IPhone struct{}
XiaoMi struct{}
)
//实现手机功能接口
func (IP *IPhone) PhoneAbility(){
fmt.Println("实现了苹果的功能")
}
func (XM *XiaoMi) PhoneAbility(){
fmt.Println("实现了小米手机的功能")
}
// 实现创建手机接口
func (ipf *IPhoneFactory) CreatePhone(){
return &IPhone{}
}
func (xmf *XiaoMiFactory) CreatePhone(){
return &XiaoMi{}
}
func main(){
//现在我们要制造苹果手机,只需要创建苹果工厂,然后createphone就可以了
var phone Phone
applefactory := &IPhoneFactory{} //创建了苹果工厂,因为所有的工厂创建手机的方法都是CreatePhone(),所以我们只要用借口调用手机功能,就能正常使用。
phone := applefactory.CreatePhone()
phone.PhoneAbility()
//这样,我们只要用创建接口变量来工作。
//创建小米手机
xiaomifactory := &XiaoMiFactory{}
phone := xiaomifactory.CreatePhone()
phone.PhoneAbility()
}
总结:
好处:
我们对实现产品进行拓展的时候,只需要实现了Phone接口,再实现一个创建该手机的方法,就可以。
type factory interface{ CreatePhone() Phone // 后添加 CreateWatch() Watch } type Phone interface{ ShowPhone() } // 后添加 type Watch interface{ ShowWatch() } type ( Iphone struct // 后添加 Iwatch struct Factory struct ) func (p *Iphone) ShowPhone(){ xxx } // 后添加 func (w *Iwatch)ShowWatch(){ xxx } func (f *Factory) CreatePhone(){ return &Iphone{} } // 后添加 func (f *Factory)CreateWatch(){ return &Iwatch{} } func main (){ var watch Iwatch watchfactory := &Factory{} watch := watchfactory.CreateWatch() watch.ShowWatch }