设计模式:
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), true
case "Square":
return new(Square), true
default:
return nil, false
}
}
测试代码:
func testSimplenessFactory() {
f := new(FactoryPattern.SimplenessFactory)
var s FactoryPattern.Shape
s, ok := f.GetShape("Rectangle")
if ok {
s.Draw()
}
}
抽象工厂(部分代码延续简单工厂):
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
主要解决:主要解决接口选择的问题。
何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。
如何解决:在一个产品族里面,定义多个产品。
关键代码:在一个工厂里聚合多个同类产品。
type AbstractFactory interface {
GetColor(colorType string) Color
GetShape(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()
}