一、工厂模式
定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。
工厂模式算是一个比较简单的模式了,简单理解就是,创建对象的工作交给工厂即可,客户端不用关心对象怎么来的,直接从工厂获得即可,类似于spring 的IOC。
工厂方法模式由抽象工厂、具体工厂、抽象产品和具体产品等4个要素构成。
- 抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 newProduct()
来创建产品。 - 具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
- 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。
- 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。
二、代码示例
//工厂模式
func main() {
//得到工厂
factory := new(LenovoFactory)
pc := factory.ProducePC()
pc.Compute()
}
//定义产品的接口(电脑)
type IPC interface {
Compute()
}
//定义一个抽象电脑工厂
type IPCFactory interface {
ProducePC() IPC
}
//定义一个具体电脑工厂,工厂实现类
type LenovoFactory struct {
}
func (factory *LenovoFactory) ProducePC() IPC {
return &LenovoPC{"Lenovo"}
}
//定义一个联想电脑,产品实现类 ,具体产品
type LenovoPC struct {
Label string
}
func (pc *LenovoPC) Compute() {
fmt.Println(pc.Label,":运行。。。。。。")
}
三、抽象工厂模式
提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。
- 系统中有多个产品族,每个具体工厂创建同一族但属于不同等级结构的产品。
- 系统一次只可能消费其中某一族产品,即同族的产品一起使用。
四、代码示例
在工厂方法模式中,厂家只生产 pc,采用抽象工厂模式后,厂家还可以生产手机。
//工厂模式
func main() {
//得到工厂
factory := new(LenovoFactory)
pc := factory.ProducePC()
phone := factory.ProducePhone()
pc.Compute()
phone.Telecom()
}
//定义产品的接口(电脑)
type IPC interface {
Compute()
}
type IPhone interface {
Telecom()
}
//定义一个抽象电脑工厂
type IFactory interface {
ProducePC() IPC
ProducePhone() IPhone
}
//定义一个具体电脑工厂,工厂实现类
type LenovoFactory struct {
}
func (factory *LenovoFactory) ProducePC() IPC {
return &LenovoPC{"Lenovo"}
}
func (factory *LenovoFactory) ProducePhone() IPhone {
return &LenovoPhone{"Lenovo"}
}
//定义一个联想电脑,产品实现类 ,具体产品
type LenovoPC struct {
Label string
}
func (pc *LenovoPC) Compute() {
fmt.Println(pc.Label,":运行。。。。。。")
}
//定义一个联想 手机实例
type LenovoPhone struct {
Label string
}
func (phone *LenovoPhone) Telecom() {
fmt.Println(phone.Label,":打电话。。。。。。")
}
