模式定义

提供一个创立一系列相干或相互依赖对象的接口,而无需指定它们具体的类

类图

利用场景

程序须要解决不同系列的相干产品,然而你不心愿它依赖于这些产品的具体类时能够应用形象工厂模式

长处

1.能够确信你从工厂失去的产品彼此是兼容的;

2.能够防止具体产品和客户端代码之间的严密耦合;

3.合乎繁多职责准则;

4.合乎开闭准则

要点总结

  • 如果没有应答“多系列对象构建”的需要变动,则没有必要应用Abstract Factory模式,这时候应用简略的工厂齐全能够
  • “系列对象”指的是在某一特定系列下的对象之间有相互依赖或作用的关系,不同系列的对象之间不能相互依赖
  • Abstract Factory模式次要在于应答“新系列”的需要变动,其毛病在于难以应答“新对象”的需要变动

Go语言代码实现

工程目录

DaoFactory.go

package AbstractFactory//记录接口type OrderMainDao interface {    SaveOrderMain()    //SearchOrderMain()}//详情接口type OrderDetailDao interface {    SaveOrderDetail()}//形象工厂接口type DaoFactory interface { //一系列相干接口    CreateOrderMainDao() OrderMainDao    CreateOrderDetailDao() OrderDetailDao}

MYSQLDetailDaoFactory.go

package AbstractFactoryimport "fmt"type MYSQLMainDao struct {}func (*MYSQLMainDao) SaveOrderMain() {   fmt.Println("MYSQL main save")}type MYSQLDetailDao struct {}func (*MYSQLDetailDao) SaveOrderDetail() {   fmt.Println("MYSQL detail save")}

MYSQLFactory.go

package AbstractFactory//形象工厂type MYSQLFactory struct {}func (*MYSQLFactory) CreateOrderMainDao() OrderMainDao {   return &MYSQLMainDao{}}func (*MYSQLFactory) CreateOrderDetailDao() OrderDetailDao {   return &MYSQLDetailDao{}}

OracleFactory.go

package AbstractFactory//形象工厂type OracleFactory struct {}func (*OracleFactory) CreateOrderMainDao() OrderMainDao {   return &OracleMainDao{}}func (*OracleFactory) CreateOrderDetailDao() OrderDetailDao {   return &OracleDetailDao{}}

OracleDetailDaoFactory.go

package AbstractFactoryimport "fmt"type OracleMainDao struct {}func (*OracleMainDao) SaveOrderMain() {   fmt.Println("Oracle main save")}type OracleDetailDao struct {}func (*OracleDetailDao) SaveOrderDetail() {   fmt.Println("Oracle detail save")}

abstractFactory_test.go

package AbstractFactoryimport "testing"func TestMySqlFactory_CreateOrderMainDao(t *testing.T) {   var factory DaoFactory   factory = &MYSQLFactory{}   factory.CreateOrderMainDao().SaveOrderMain()   factory.CreateOrderDetailDao().SaveOrderDetail()   factory = &OracleFactory{}   factory.CreateOrderDetailDao().SaveOrderDetail()   factory.CreateOrderMainDao().SaveOrderMain()}