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