工厂模式
意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
扩展性高,符合“开闭原则”
屏蔽产品的具体实现,调用者只关心产品的接口
一个调用者想创建一个对象,只要知道其名称就可以了。
向客户隐藏了哪种具体产品类将被实例化这一细节,用户只需要关心所需产品对应的工厂,无须关心创建细节,甚至无须知道具体产品类的类名。
工厂可以自主确定创建何种产品对象,而如何创建这个对象的细节则完全封装在具体工厂内部。
使用多个工厂方法:
在抽象工厂角色中可以定义多个工厂方法,从而使具体工厂角色实现这些不同的工厂方法,这些方法可以包含不同的业务逻辑,以满足对不同的产品对象的需求
// 这里说的工厂方法,其实就是不同的 product factory struct
产品对象的重复使用:
工厂对象将已经创建过的产品保存到一个集合(如数组、List等)中,然后根据客户对产品的请求,对集合进行查询。
1.如果有满足要求的产品对象,就直接将该产品返回客户端;
2.如果集合中没有这样的产品对象,那么就创建一个新的满足要求的产品对象,然后将这个对象在增加到集合中,再返回给客户端。
多态性的丧失和模式的退化:
如果工厂仅仅返回一个具体产品对象,便违背了工厂方法的用意,发生退化,此时就不再是工厂方法模式了。
一般来说,工厂对象应当有一个抽象的父类型,
如果工厂等级结构中只有一个具体工厂类的话,抽象工厂就可以省略,也将发生了退化。
当只有一个具体工厂,在具体工厂中可以创建所有的产品对象,并且工厂方法设计为静态方法时,工厂方法模式就退化成简单工厂模式。
在以下情况下可以使用工厂方法模式:
一个类不知道它所需要的对象的类:
客户端不需要知道 product 类名,只需知道创建具体产品的 product factory
// 小声bb下,要知道具体产品的业务方法....
一个类通过其子类来指定创建哪个对象:
对于抽象工厂类只需要提供一个 创建产品 的接口,而由其子类来确定具体要创建的对象,利用面向对象的多态性和里氏代换原则,在程序运行时,子类对象将覆盖父类对象,从而使得系统更容易扩展。
// 创建产品的接口 factory struct
// 产品的接口 product struct
将创建对象的任务委托给多个工厂子类中的某一个,
客户端在使用时可以无须关心是哪一个工厂子类创建产品子类,需要时再动态指定,可将具体工厂类的类名存储在配置文件或数据库中。
同简单工厂模式
abstruct product 抽象产品
// 手机类 interface
// 具体的手机 struct
// 手机厂类 interface
工厂父类负责定义 (怎样创建产品) 的公共接口
声明了工厂方法,用于返回一个产品,它是工厂方法模式的核心,任何在模式中创建对象的工厂类都必须实现该接口;
// 具体到哪个厂 struct
工厂子类则负责生成具体的产品对象 product
抽象工厂类的子类,实现了抽象工厂中定义的工厂方法,并可由客户调用,返回一个具体产品类的实例
一个工厂只生产一个产品
package main
import "fmt"
// 手机类:抽象产品 abstruct product
type Phone interface {
Call()
}
// 小米手机 :产品 product
type XiaoMiPhone struct{}
// 小米手机实现手机的功能 :call()
func (this *XiaoMiPhone) Call() {
fmt.Println("小米手机天下第一")
}
// 华为手机 :产品 product
type HuaWeiPhone struct{}
// 华为手机实现手机的功能 :call()
func (this *HuaWeiPhone) Call() {
fmt.Println("华为手机天下第一")
}
// 手机制造厂类: 抽象工厂 abstruct factory
type PhoneFactory interface {
Create() Phone
}
// 工厂可以自主确定创建何种产品对象,
// 而如何创建这个对象的细节则完全封装在具体工厂内部。
// 小米工厂 :factory 使用 create 可以初始化一个 小米手机
type XiaoMiFactory struct{}
func (this *XiaoMiFactory) Create() Phone {
return &XiaoMiPhone{}
}
//工厂实例化.工厂创建
func CreatexmFactory() PhoneFactory {
return &XiaoMiFactory{}
}
// 华为工厂 :factory 使用 create 可以初始化一个 华为手机
type HuaWeiFactory struct{}
func (this *HuaWeiFactory) Create() Phone {
return &HuaWeiPhone{}
}
//工厂实例化.工厂创建
func CreatehwFactory() PhoneFactory {
return &HuaWeiFactory{}
}
// 调用
func main() {
huawei := CreatehwFactory() //创建/进入华为工厂
huawei.Create().Call() //创建一个华为手机,并使用它的 call 功能
}
原文:https://www.cnblogs.com/shulei/p/13491532.html