设计模式

设计模式 #

创建型
//在一些情况下,要创建的对象需要一系列复杂的初始化操作,比如查配置文件、查数据库表、初始化成员对象等,如果把这些逻辑放在构造函数中,会极大影响代码的可读性。不妨定义一个类来专门负责对象的创建,这样的类就是工厂类,这种做法就是工厂模式
    简单工厂模式:根据传入的入参生成不同的结构体的接口方法(有一个具体的工厂类可以根据传入参数生产不同的产品)由一个对象负责所有具体类的实例化
    工厂方法模式:解决根据简单工厂入参的判断问题,(只需要知道具体工厂名即可生产对应产品),将对象创建从由一个对象负责所有具体类的实例化变成由一群子类来负责对具体类的实例化从而将过程解耦
    抽象工厂模式子类会越来越多可以将产品进行分组每组中的不同产品由同一个工厂类的不同方法来创建
    创建者模式:将一个复杂对象的构建分离成多个简单对象的构建组合;(将一个复杂的对象的构造和表示分离使同样的构造过程可以创建不同的产品)
    原型模式:使对象能复制自身并且暴露到接口中使客户端面向接口编程时不知道接口实际对象的情况下生成新的对象
    单例模式:

结构型模式
    外观模式
    适配器模式
    代理模式
    组合模式
    享元模式
    装饰模式
    桥模式

行为型模式
    中介者模式:
    观察者模式:
    命令模式:
    迭代器模式:
    模板方法模式:
    策略模式:
    状态模式:
    备忘录模式:
    解释器模式:
    职责链模式:
    访问者模式:

创建型 #

简单工厂模式 #

//简单工厂模式有一个具体的工厂类,可以根据传入的入参,生产不同的产品
func main() {
	f := getFruit("apple")
	fmt.Println(f.Fruit())
}

type FruitFactory interface {
	Fruit() string
}

func getFruit(t string) FruitFactory {
	switch t {
	case "apple":
		return &apple{}
	case "banana":
		return &banana{}
	}

	return nil
}

type apple struct{}

func (*apple) Fruit() string {
	return "我是苹果,我很好吃"
}

type banana struct{}

func (*banana) Fruit() string {
	return "我是香蕉,我最好吃了"
}

工厂方法模式 #

//工厂方法 调用方只需要知道具体工厂名即可生成对应产品
//工厂方法模式使用子类的方式延迟生成对象到子类中实现。
func main() {
	apple := appleFactory{}
	fmt.Println(apple.Fruit())

	banana := bananaFactory{}
	fmt.Println(banana.Fruit())
}

type Fruit interface {
	Fruit() string
}

type appleFactory struct{}

func (*appleFactory) Fruit() string {
	return "我是苹果,我很好吃"
}

type bananaFactory struct{}

func (*bananaFactory) Fruit() string {
	return "我是香蕉,我最好吃了"
}

抽象工厂模式 #

func main() {
	f := WuhanFruitFactory{}
	b := f.ChooseApple()
	b.Fruit()
}

type FruitInterface interface {
	ChooseApple() ProductInterface
	ChooseBanana() ProductInterface
}

type ProductInterface interface {
	Fruit()
}

type HainanApple struct {
}

func (h HainanApple) Fruit() {
	fmt.Println("我是苹果,来自海南")
}

type HainanBanana struct {
}

func (h HainanBanana) Fruit() {
	fmt.Println("我是香蕉,来自海南")
}

type WuhanApple struct {
}

func (w WuhanApple) Fruit() {
	fmt.Println("我是苹果,来自武汉")
}

type WuhanBanana struct {
}

func (w WuhanBanana) Fruit() {
	fmt.Println("我是香蕉,来自武汉")
}

type WuhanFruitFactory struct {
}

func (w WuhanFruitFactory) ChooseApple() ProductInterface {
	return WuhanApple{}
}

func (w WuhanFruitFactory) ChooseBanana() ProductInterface {
	return WuhanBanana{}
}

type HainanFruitFactory struct {
}

func (gd HainanFruitFactory) ChooseApple() ProductInterface {
	return HainanApple{}
}

func (gd HainanFruitFactory) ChooseBanana() ProductInterface {
	return HainanBanana{}
}

创建者模式 #

//Builder 是生成器接口
type Builder interface {
	Part1()
	Part2()
	Part3()
}

type Director struct {
	builder Builder
}

// NewDirector ...
func NewDirector(builder Builder) *Director {
	return &Director{
		builder: builder,
	}
}

//Construct Product
func (d *Director) Construct() {
	d.builder.Part1()
	d.builder.Part2()
	d.builder.Part3()
}

type Builder1 struct {
	result string
}

func (b *Builder1) Part1() {
	b.result += "1"
}

func (b *Builder1) Part2() {
	b.result += "2"
}

func (b *Builder1) Part3() {
	b.result += "3"
}

func (b *Builder1) GetResult() string {
	return b.result
}

原型模式 #

单例模式 #

结构型模式 #

外观模式 #

适配器模式 #

代理模式 #

组合模式 #

享元模式 #

装饰模式 #

桥模式 #

行为型模式 #

中介者模式 #

观察者模式 #

命令模式 #

迭代器模式 #

模板方法模式 #

策略模式 #

状态模式 #

备忘录模式 #

解释器模式 #

职责链模式 #

访问者模式 #