当前位置: 首页 > news >正文

GO抽象工厂模式

既然工厂模式每个产品都需要实现对应的工厂类去生成相关实例,提取产品的共性,提高代码的内聚性,
就是抽象工厂模式要干的。在抽象工厂中,依然是不同产品对应不同的工厂类,但可以尽可能将具有相同共性的产品类别合在一起,
从而提高了内聚性。但同时也带来一些问题,比如修改产品类,可能涉及到对应的工厂类都需要改动,OCP原则有没有很好的遵守,
而且通过更加地抽象化,也增加了代码的理解难度。

type OrderMainDAO interface {SaveOrderMain()
}//OrderDetailDAO 为订单详情纪录
type OrderDetailDAO interface {SaveOrderDetail()
}//DAOFactory DAO 抽象模式工厂接口
type DAOFactory interface {CreateOrderMainDAO() OrderMainDAOCreateOrderDetailDAO() OrderDetailDAO
}// RDBMainDAO  为关系型数据库的OrderMainDAO实现
type RDBMainDAO struct{}func (*RDBMainDAO) SaveOrderMain() {fmt.Print("rdb main save\n")
}type RDBDetailDAO struct{}func (*RDBDetailDAO) SaveOrderDetail() {fmt.Print("rdb detail save\n")
}//RDBDAOFactory 是RDB 抽象工厂实现
type RDBDAOFactory struct{}func (*RDBDAOFactory) CreateOrderMainDAO() OrderMainDAO {return &RDBMainDAO{}
}func (*RDBDAOFactory) CreateOrderDetailDAO() OrderDetailDAO {return &RDBDetailDAO{}
}//XMLMainDAO XML存储
type XMLMainDAO struct{}//SaveOrderMain ...
func (*XMLMainDAO) SaveOrderMain() {fmt.Print("xml main save\n")
}//XMLDetailDAO XML存储
type XMLDetailDAO struct{}// SaveOrderDetail ...
func (*XMLDetailDAO) SaveOrderDetail() {fmt.Print("xml detail save")
}//XMLDAOFactory 是RDB 抽象工厂实现
type XMLDAOFactory struct{}func (*XMLDAOFactory) CreateOrderMainDAO() OrderMainDAO {return &XMLMainDAO{}
}func (*XMLDAOFactory) CreateOrderDetailDAO() OrderDetailDAO {return &XMLDetailDAO{}
}测试方法
package abstractfactoryimport "testing"func getMainAndDetail(factory DAOFactory) {factory.CreateOrderMainDAO().SaveOrderMain()factory.CreateOrderDetailDAO().SaveOrderDetail()
}func ExampleRdbFactory() {var factory DAOFactoryfactory = &RDBDAOFactory{}getMainAndDetail(factory)
}func TestRDBFactory(t *testing.T) {var factory DAOFactoryfactory = &RDBDAOFactory{}getMainAndDetail(factory)
}func TestXMLDAOFactory(t *testing.T) {var factory DAOFactoryfactory = &XMLDAOFactory{}getMainAndDetail(factory)
}
http://www.lryc.cn/news/239084.html

相关文章:

  • Linux 磁盘/分区/修复 命令
  • php一句话木马免杀
  • 深度学习人体跌倒检测 -yolo 机器视觉 opencv python 计算机竞赛
  • 轻松整理文件夹,将视频文件全部归类到另一个文件夹!
  • 存储服务器特征是什么
  • Conditional GAN
  • OOM问题排查+Jvm优化
  • 链表:C++实现
  • 使用JMX监控ZooKeeper和Kafka
  • 蓝桥等考C++组别七级008
  • sam和mobilesam导出预处理的onnx
  • 开源与闭源:大模型发展的双重走向
  • c# 逆变 / 协变
  • electron使用better-sqlite3打包失败(electron打包有进程没有界面)
  • 2.6文件服务器
  • 【C++ 学习 ㊴】- 详解 C++ 的 I/O 流
  • js算法面试题(附答案)
  • 2023 年戴森设计大奖得主是谁?给大楼降温、争取救援机会
  • 〖大前端 - 基础入门三大核心之JS篇㊲〗- DOM改变元素节点的css样式、HTML属性
  • 【word技巧】Word制作试卷,ABCD选项如何对齐?
  • OpenHarmony 4.1计划明年Q1发布, 5.0预计Q3发布
  • 蓝桥等考C++组别八级002
  • 秋招JAVA面经总结
  • Postgresql源码(116)提升子查询案例分析
  • CNP实现应用CD部署
  • kubeadm join 192.168.10.16:6443 --token xxx报错Failed to request cluster-info
  • 车载以太网-传输层-TCP
  • java:简单入门定时任务的几种方式Timer、Quartz、Spring Task
  • 木子-前端-方法标签属性小记(普通jsp/html篇)2023~2024
  • 音视频项目—基于FFmpeg和SDL的音视频播放器解析(十七)