关于设计模式:设计模式抽象工厂Abstract-Factory模式

6次阅读

共计 1899 个字符,预计需要花费 5 分钟才能阅读完成。

模式定义

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

类图

利用场景

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

长处

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 AbstractFactory

import "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 AbstractFactory

import "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 AbstractFactory

import "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()
}
正文完
 0