设计模式:

wiki百科:设计模式(Design pattern)代表了最佳的实践,通常被软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理地运用设计模式可以完美地解决很多问题,每种模式在现实中都有相应的原理来与之对应,每种模式都描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是设计模式能被广泛应用的原因。

再来说说Golang,严格来讲,Go不是OOP的语言,但是又允许有OOP的编程风格,于是本着学习Golang加上复习设计模式的想法上,准备将设计模式拿Golang在写一遍。

简单工厂:

工厂模式(Factory Pattern)最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

主要解决:主要解决接口选择的问题。

何时使用:我们明确地计划不同条件下创建不同实例时。

如何解决:让其子类实现工厂接口,返回的也是一个抽象的产品。

关键代码:创建过程在其子类执行。

type Shape interface {Draw()
}type Rectangle struct {
}func (s *Rectangle) Draw() {fmt.Print("draw Rectangle!")
}type Square struct {
}func (s *Square) Draw() {fmt.Println("draw Square!")
}type SimplenessFactory struct {
}func (s *SimplenessFactory) GetShape(shapeType string) (Shape, bool) {if shapeType == "" {return nil, false}switch shapeType {case "Rectangle":return new(Rectangle), truecase "Square":return new(Square), truedefault:return nil, false}
}

测试代码:

func testSimplenessFactory() {f := new(FactoryPattern.SimplenessFactory)var s FactoryPattern.Shapes, ok := f.GetShape("Rectangle")if ok {s.Draw()}
}

抽象工厂(部分代码延续简单工厂):

抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

主要解决:主要解决接口选择的问题。

何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。

如何解决:在一个产品族里面,定义多个产品。

关键代码:在一个工厂里聚合多个同类产品。

type AbstractFactory interface {GetColor(colorType string) ColorGetShape(shapeType string) Shape
}type AbsFactory struct {
}func (s *AbsFactory) GetShape(colorType string) Shape {if colorType == "" {return nil}switch colorType {case "Rectangle":return new(Rectangle)case "Square":return new(Square)default:return nil}
}func (s *AbsFactory) GetColor(shapeType string) Color {if shapeType == "" {return nil}switch shapeType {case "Red":return new(Red)case "Green":return new(Green)case "Blue":return new(Blue)default:return nil}
}type Color interface {Fill()
}type Red struct {
}func (s *Red) Fill() {fmt.Println("Red Fill")}type Green struct {
}func (s *Green) Fill() {fmt.Println("Green Fill")}type Blue struct {
}func (s *Blue) Fill() {fmt.Println("BlueFill")
}

测试代码:

func testAbstractFactory() {f := new(FactoryPattern.AbsFactory)color := f.GetColor("Red")color.Fill()shape := f.GetShape("Rectangle")shape.Draw()
}

Github:https://github.com/zhumengyifang/GolangDesignPatterns 实现代码

下一篇:https://blog.csdn.net/weixin_40165163/article/details/90648149 单例设计模式

Golang 工厂设计模式(一)相关推荐

  1. Java设计模式(四):工厂设计模式

    1. 工厂设计模式 1.1 应用场景 由于需求的变化,一个类的子类经常面临着剧烈的变化,但他却拥有比较稳定的接口.使用一种封装机制来"隔离这种易变对象的变化",工厂方法定义一个用于 ...

  2. 工厂设计模式----python版本

    #!/usr/bin/python # -*- coding: UTF-8 -*- #工厂设计模式 ''' date:2016/8/21 ''' #形状接口 class Shape(object):d ...

  3. 用C# (.NET Core) 实现抽象工厂设计模式

    本文的概念性内容来自深入浅出设计模式一书.上一篇文章讲了简单工厂和工厂方法设计模式 使用的是披萨店的例子. 文将继续使用这个例子, 这里要用到抽象工厂. 披萨店的需求变更 现在披萨店在各地授权了很多连 ...

  4. 抽象工厂和工厂方法示例_抽象工厂设计模式示例

    抽象工厂和工厂方法示例 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此 ...

  5. 设计模式 工厂方法_工厂设计模式–一种有效的方法

    设计模式 工厂方法 如您所知,"工厂方法模式"或俗称"工厂设计模式"是"创意设计模式"类别下的一种设计模式. 模式背后的基本原理是,在运行时 ...

  6. 工厂设计模式和策略设计模式_设计模式:策略

    工厂设计模式和策略设计模式 这次我想谈谈策略设计模式 . 通过这种方式,我开始撰写有关行为设计模式的文章. 这种模式表示对象之间的某些交互模式,以使代码更灵活且组织得更好.此方法的最本质点是对象之间的 ...

  7. 抽象工厂模式设计模式_抽象工厂设计模式解释

    抽象工厂模式设计模式 抽象工厂设计模式是工厂设计模式的另一种形式. 这种模式可以被视为"超级工厂"或"工厂工厂". 抽象工厂设计模式(属于"四人帮&q ...

  8. 工厂模式个人案例_工厂设计模式案例研究

    工厂模式个人案例 我有一份工作来检查我们的项目代码质量. 如果我在项目中发现任何障碍,必须将其报告给我的团队负责人. 我发现了很多漏洞,我认为可以在博客上进行讨论. 不是嘲笑作者,而是一起学习和改进自 ...

  9. 抽象工厂设计模式示例

    本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此重要的原因,并了解何时以 ...

最新文章

  1. 解决 Windows10 和 Ubuntu18.04.4 双系统 时间同步不一致问题
  2. iframe的应用 实现无刷新用户注册
  3. python 的钻石继承问题
  4. dismiss ios pop效果_iOS 动画框架pop使用方法
  5. python处理报错_python3报错及解决方案/须注意的细节(持续更新)
  6. 【ES】CURL 操作 ES命令集合
  7. 中石化shell_中石化壳牌(江苏)加油站百日攻坚创效分享
  8. 小米机器狗CyberDog
  9. 论模式在领域驱动设计中的重要性
  10. 计算机通过华为手机上网,华为手机usb共享电脑的网络怎么办
  11. Qcom平台,dump解析环境配置
  12. Anaconda Prompt :python.exe - 无法找到入口,无法定位程序输入点
  13. C#生成格林威治时间字符串
  14. #CSDN精选博文##学习必备##IT技术学习#系统化学习的第一步:建构自己的知识体系
  15. c语言错误不允许使用不完整的类型,C语言不允许使用不完整的类型报错是什么意思啊...
  16. 朱清时——物理学步入禅境:缘起性空-(技术工作者上升到哲学思维)
  17. 企业级网络性能优化 课内8 vlanif2in1
  18. win7耳机插前面没声音_【电脑】第8期分享:电脑没声音怎么去解决?
  19. Mybatis常见错误 Could not find resource com/mybatis/mapper/UserInfoMapper.xml
  20. Python-打印乘法口诀表

热门文章

  1. SpringBoot - @Conditional
  2. 用jQuery实现下拉菜单效果
  3. 打印的时候计算机出现蓝屏,在电脑打印时电脑总是会蓝屏或重启怎么处理
  4. android 权限清单
  5. linux 系统 ko模块编译
  6. MsSqlServer 错误
  7. IIS7 实现301永久重定向
  8. Golang 010. 互质勾股数组
  9. Flutter聊天页面
  10. if语句-分段函数1