008设计模式--建造者模式(Bulider Pattern)

2022-12-16  本文已影响0人  _Cappuccino_

一、什么是建造者模式

建造者模式是设计模式的一种,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

建造者模式是将一个复杂对象的构建过程与它的实现表示分离,使得同样的构建过程可以创建不同的表示,属于创建型模式。使用创建者模式对于用户而言只需要制定需要建造的类就可以获得对象,建造过程及细节不需要了解。

建造者模式适用于创建对象需要很多步骤,但是步骤的顺序不一定固定。如果一个对象有非常复杂的内部结构,可以将复杂对象的创建和使用进行分离。

二、建造者模式的结构

角色 含义
产品角色 它是包含多个组成部件的复杂对象,由具体建造者来创建其各个零部件
抽象建造者 它是一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法
具体建造者 实现 Builder 接口,完成复杂产品的各个部件的具体创建方法。可以有不同的具体建造者
指挥者 它调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息

三、建造者模式的代码实现

python实现
from abc import ABCMeta, abstractmethod


class Player(object):
    def __init__(self, face=None, leg=None):
        self.face = face
        self.leg = leg

    def __str__(self):
        return f'{self.face}--{self.leg}'


# 抽象建造者
class BaseBuilder(metaclass=ABCMeta):
    @abstractmethod
    def build_face(self):
        pass

    @abstractmethod
    def build_leg(self):
        pass


class BeautifulBuilder(BaseBuilder):
    def __init__(self):
        self.player = Player()

    def build_face(self):
        self.player.face = '美女的脸'

    def build_leg(self):
        self.player.leg = '美女的腿'


class MonsterBuilder(BaseBuilder):
    def __init__(self):
        self.player = Player()

    def build_leg(self):
        self.player.leg = '怪兽的腿'

    def build_face(self):
        self.player.face = '怪兽的脸'


class PlayerDirector(object):
    def build_player(self, builder):
        builder.build_face()
        builder.build_leg()
        return builder.player


if __name__ == '__main__':
    builder = MonsterBuilder()
    director = PlayerDirector()
    p = director.build_player(builder)
    print(p)
golang实现
type Person struct {
    name, sex, address string
    age                int
}
func (p *Person) PrintInfo() {
    fmt.Printf("姓名: %s, 年龄: %d, 性别: %s, 住址: %s\n", p.name, p.age, p.sex, p.address)
}

type PersonBuilder struct {
    person *Person
}

func NewPersonBuilder() *PersonBuilder {
    return &PersonBuilder{person: &Person{}}
}

func (p *PersonBuilder) Name(name string) *PersonBuilder {
    p.person.name = name
    return p
}

func (p *PersonBuilder) Sex(sex string) *PersonBuilder {
    p.person.sex = sex
    return p
}

func (p *PersonBuilder) Address(address string) *PersonBuilder {
    p.person.address = address
    return p
}

func (p *PersonBuilder) Age(age int) *PersonBuilder {
    p.person.age = age
    return p
}

func (p *PersonBuilder) Build() *Person {
    return p.person
}

func main() {
    p := NewPersonBuilder().
        Name("张三").
        Age(18).
        Sex("男").
        Address("上海").
        Build()
    p.PrintInfo()
}

四、建造者模式的优缺点

优点
缺点

五、建造者模式的应用场景

建造者模式主要适用于以下应用场景:

六、对比

工厂模式和建造者模式的对比

建造者模式唯一区别于工厂模式的是是否是复杂对象的创建。也就是说,如果创建简单对象,通常都是使用工厂模式进行创建,而如果创建复杂对象,就可以考虑使用建造者模式。
当需要创建的产品具备复杂创建过程时,可以抽取出共性创建过程,然后交由具体实现类自定义创建流程,使得同样的创建行为可以生产出不同的产品,分离了创建与表示,使创建产品的灵活性大大增加。

七、总结

建造者模式的使用场合是当创建复杂对象时,把创建对象成员和装配方法分离出来,放在建造者类中去实现,用户使用该复杂对象时,不用理会它的创建和装配过程,只关心它的表示形式。

上一篇下一篇

猜你喜欢

热点阅读