之前一个非常友善的面试官推荐我好好学习一下设计模式,可以提升眼界、改变思考问题的方式,所以找了《设计模式-可复用面向对象软件的基础》一书,虽然其中的代码示例都是C++,但读下来还是有很多收获,这里用go语言写一下我学习到的东西
创造型设计模式一共有五种,前面的两篇文章已经讲了四种,今天把最后一种补上,再讲一下五种创造型设计模式的总结
1. 建造者设计模式
建造者设计模式是一种创建型设计模式。它的主要思想是将对象的构造过程与其表示分离。通过这种方式,可以使相同的构造过程可以创建不同的表示形式。
应用场景
适用于以下场景:
- 对象的构造非常复杂,需要多个步骤来完成。
- 需要创建不同形式的相同对象,例如创建具有不同颜色、尺寸或形状的汽车。
示例实现
下面是一个简单的示例代码,我们将使用建造者设计模式来构建Person类型的对象,从而创建不同形式的Person对象。具体实现如下:
type Person struct {
Name string
Age int
Address string
}
type PersonBuilder struct {
person *Person
}
func NewPersonBuilder() *PersonBuilder {
return &PersonBuilder{
person: &Person{},
}
}
func (b *PersonBuilder) SetName(name string) *PersonBuilder {
b.person.Name = name
return b
}
func (b *PersonBuilder) SetAge(age int) *PersonBuilder {
b.person.Age = age
return b
}
func (b *PersonBuilder) SetAddress(address string) *PersonBuilder {
b.person.Address = address
return b
}
func (b *PersonBuilder) Build() *Person {
return b.person
}
// 示例代码
func main() {
builder := NewPersonBuilder()
person1 := builder.SetName("Tom").SetAge(18).Build()
person2 := builder.SetName("Mike").SetAddress("New York").Build()
fmt.Printf("person1: %+v\n", person1)
fmt.Printf("person2: %+v\n", person2)
}
在上面的代码中,我们创建了一个Person类型的建造者对象。通过调用不同的方法来设置Person类型对象的属性。最后,通过调用Build方法构建Person类型的对象,并且创建不同形式的Person对象。最后,将创建的新对象输出到控制台。
总结
创造型设计模式是指在创建对象的方式上,使用特定的设计模式来解决问题,其中包括以下五种:
-
工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定将哪一个类实例化。工厂方法使得一个类的实例化延迟到其子类。
-
抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或者相互依赖对象的接口,而无需指定它们具体的类。
-
单例模式(Singleton Pattern):确保一个类只有一个实例,并提供一个全局访问点。
-
建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使同样的构建过程可以创建不同的表示。
-
原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
下面是这五种创造型设计模式的区别:
-
工厂方法模式和抽象工厂模式都是为了解决对象的创建问题,但工厂方法模式注重的是产品等级的划分,而抽象工厂模式注重的是产品族的划分。
-
单例模式是为了保证对象的唯一性,而工厂方法模式、抽象工厂模式、建造者模式和原型模式都是为了解耦对象的创建过程和使用过程。
-
工厂方法模式、抽象工厂模式和建造者模式都是通过接口或抽象类来封装对象的创建过程,而单例模式和原型模式则是直接在类中实现对象的创建。
-
工厂方法模式和抽象工厂模式都可以用来创建一组相关的对象,但工厂方法模式更侧重于针对一个产品等级结构,而抽象工厂模式针对多个产品等级结构。
-
建造者模式重点在于分离对象的构建和表示,使得同样的构建过程可以创建不同的表示,而抽象工厂模式重点在于创建所有族的所有对象。