模式定义
提供一个创立一系列相干或相互依赖对象的接口,而无需指定它们具体的类
类图
利用场景
程序须要解决不同系列的相干产品,然而你不心愿它依赖于这些产品的具体类时能够应用形象工厂模式
长处
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()}