Golang 设计模式

创建型模式

简单工厂模式

简单工厂模式是一种创建型设计模式。它定义了一个工厂类,这个工厂类负责创建产品对象。客户端(使用产品的代码)只需要向工厂类请求所需的产品,而不需要知道产品是如何创建的,这样就将产品的创建和使用分离,使得代码的结构更加清晰。
假设我们要创建一个图形绘制工具,首先定义一个图形接口,然后有不同的图形类实现这个接口。

图形接口

type Shape interface {
   
   
    Draw()
}

具体图形类:圆形

type Circle struct{
   
   }

func (c *Circle) Draw() {
   
   
    println("Drawing a circle")
}

具体图形类:矩形

type Rectangle struct{
   
   }

func (r *Rectangle) Draw() {
   
   
    println("Drawing a rectangle")
}

工厂类定义

接着创建简单工厂类,用于生产不同的图形。

  type ShapeFactory struct{
   
   }

  func (f *ShapeFactory) CreateShape(shapeType string) Shape {
   
   
      if shapeType == "circle" {
   
   
          return &Circle{
   
   }
      } else if shapeType == "rectangle" {
   
   
          return &Rectangle{
   
   }
      }
      return nil
  }

使用简单工厂模式

在主函数或者其他客户端代码中,可以这样使用工厂类来获取产品(图形)并使用。

  func main() {
   
   
      factory := &ShapeFactory{
   
   }
      circle := factory.CreateShape("circle")
      circle.Draw()

      rectangle := factory.CreateShape("rectangle")
      rectangle.Draw()
  }

抽象工厂模式

抽象工厂方法模式是一种创建型设计模式,它提供了一种创建对象的方式,将对象的创建和使用分离,使得代码更具灵活性和可维护性。其核心在于有一个抽象工厂接口,该接口定义了创建一系列相关产品对象的抽象方法,然后由具体的工厂类来实现这些抽象方法,创建具体的产品对象。

1. 定义产品接口

首先,定义一系列相关的产品接口,比如这里假设有两种产品:ProductA和ProductB。

// ProductA接口,代表产品A的抽象
type ProductA interface {
   
   
    Use()
}

// ProductB接口,代表产品B的抽象
type ProductB interface {
   
   
    Use()
}

接口中定义了Use方法,用于表示产品的使用行为,具体的产品实现类需要实现这个方法。

2. 定义具体产品实现类

接着,创建具体的产品实现类,分别实现ProductA和ProductB接口。

// ConcreteProductA1是ProductA接口的一个具体实现
type ConcreteProductA1 struct{
   
   }

func (p *ConcreteProductA1) Use() {
   
   
    println("Using ConcreteProductA1")
}

// ConcreteProductA2是ProductA接口的另一个具体实现
type ConcreteProductA2 struct{
   
   }

func (p *ConcreteProductA2) Use() {
   
   
    println("Using ConcreteProductA2")
}

// ConcreteProductB1是ProductB接口的一个具体实现
type ConcreteProductB1 struct{
   
   }

func (p *ConcreteProductB1) Use() {
   
   
    println("Using ConcreteProductB1")
}

// ConcreteProductB2是ProductB接口的另一个具体实现
type ConcreteProductB2 struct{
   
   }

func (p *ConcreteProductB2) Use() {
   
   
    println("Using ConcreteProductB2")
}

这些具体产品类实现了各自接口的Use方法,定义了具体的使用行为,比如打印出不同的使用提示信息。

3. 定义抽象工厂接口

然后,定义抽象工厂接口,它声明了创建ProductA和ProductB的抽象方法。

// AbstractFactory接口,定义创建产品的抽象方法
type AbstractFactory interface {
   
   
    CreateProductA() ProductA
    CreateProductB() ProductB
}

4. 定义具体工厂实现类

再创建具体的工厂实现类,实现抽象工厂接口,根据具体工厂的逻辑来创建对应的具体产品。

// ConcreteFactory1是AbstractFactory接口的一个具体实现,用于创建特定组合的产品
type ConcreteFactory1 struct{
   
   }

func (f 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值