Golang学习笔记_25——协程
Golang学习笔记_26——通道
Golang学习笔记_27——单例模式
文章目录
- 工厂方法模式
- 1. 介绍
- 2. 优点
- 3. 类图
- 4. 实现
- 源码
工厂方法模式
1. 介绍
工厂方法模式(Factory Method)是一种创建型设计模式,它提供了一种创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法模式让类的实例化推迟到子类中进行
2. 优点
-
解耦:将对象的创建与使用分离,客户端不需要知道具体的类名。
-
扩展性:增加新的产品类时,只需添加相应的工厂类即可,符合开闭原则。
-
单一职责原则:将创建对象的代码封装在工厂中,职责单一。
3. 类图
-
Product(产品接口):定义了产品的接口,所有具体产品都要实现这个接口。
-
ConcreteProduct(具体产品):实现了Product接口的具体类。
-
Creator(工厂接口):声明了工厂方法,用于返回一个Product对象。
-
ConcreteCreator(具体工厂):实现了工厂接口,返回具体产品的实例。
+-----------------+| Product |<----------------++-----------------+ || + Use() | |+-----------------+ |^ || |+-----------------+ +-----------------+| ConcreteProductA| | ConcreteProductB|+-----------------+ +-----------------+| + Use() | | + Use() |+-----------------+ +-----------------++-----------------+| Creator |<----------------++-----------------+ || + CreateProduct()| |+-----------------+ |^ || |+-----------------+ +-----------------+| ConcreteCreatorA| | ConcreteCreatorB|+-----------------+ +-----------------+| + CreateProduct()| | + CreateProduct()|+-----------------+ +-----------------+
4. 实现
// Product 是产品接口
type Product interface {Use() string
}// ConcreteProductA 是具体产品A
type ConcreteProductA struct{}func (p *ConcreteProductA) Use() string {return "使用产品A"
}// ConcreteProductB 是具体产品B
type ConcreteProductB struct{}func (p *ConcreteProductB) Use() string {return "使用产品B"
}// Factory 是工厂接口
type Factory interface {CreateProduct() Product
}// ConcreteFactoryA 是具体工厂A
type ConcreteFactoryA struct{}func (f *ConcreteFactoryA) CreateProduct() Product {return &ConcreteProductA{}
}// ConcreteFactoryB 是具体工厂B
type ConcreteFactoryB struct{}func (f *ConcreteFactoryB) CreateProduct() Product {return &ConcreteProductB{}
}
源码
// Product 是产品接口
type Product interface {Use() string
}// ConcreteProductA 是具体产品A
type ConcreteProductA struct{}func (p *ConcreteProductA) Use() string {return "使用产品A"
}// ConcreteProductB 是具体产品B
type ConcreteProductB struct{}func (p *ConcreteProductB) Use() string {return "使用产品B"
}// Factory 是工厂接口
type Factory interface {CreateProduct() Product
}// ConcreteFactoryA 是具体工厂A
type ConcreteFactoryA struct{}func (f *ConcreteFactoryA) CreateProduct() Product {return &ConcreteProductA{}
}// ConcreteFactoryB 是具体工厂B
type ConcreteFactoryB struct{}func (f *ConcreteFactoryB) CreateProduct() Product {return &ConcreteProductB{}
}func test() {// 创建具体工厂AfactoryA := &ConcreteFactoryA{}// 使用工厂A创建产品AproductA := factoryA.CreateProduct()// 使用产品Aprintln(productA.Use())// 创建具体工厂BfactoryB := &ConcreteFactoryB{}// 使用工厂B创建产品BproductB := factoryB.CreateProduct()// 使用产品Bprintln(productB.Use())
}