设计模式-建造者模式

2021-03-24  本文已影响0人  anlostsheep

设计模式

设计模式的本质是面向对象设计原则的实际运用,是对类的==封装性==、==继承性==和==多态性==以及类的关联关系和组合关系的充分理解。

创建型模式-建造者模式

定义:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。
它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。
eg: 汽车中的方向盘、发动机、车架、轮胎等部件组装,计算机由 CPU、主板、内存、硬盘、显卡、机箱、显示器、键盘、鼠标等部件组装。

特点:

缺点:

结构

建造者(==Builder==)模式由产品、抽象建造者、具体建造者、指挥者等 4 个要素构成

主要角色说明:

UML 类图关系

image

建造者模式的实际体现

JDK

StringBuilder:

public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, CharSequence{
    
    @Override
    public StringBuilder append(Object obj) {
        return append(String.valueOf(obj));
    }

    @Override
    public StringBuilder append(String str) {
        super.append(str);
        return this;
    }

    @Override
    public StringBuilder append(CharSequence s) {
        super.append(s);
        return this;
    }

    @Override
    public StringBuilder append(char[] str) {
        super.append(str);
        return this;
    }
    ...
}

AbstractStringBuilder:

abstract class AbstractStringBuilder implements Appendable, CharSequence {
    public AbstractStringBuilder append(String str) {
        if (str == null)
            return appendNull();
        int len = str.length();
        ensureCapacityInternal(count + len);
        str.getChars(0, len, value, count);
        count += len;
        return this;
    }
}

Appendable:

public interface Appendable {
    Appendable append(CharSequence csq) throws IOException;
    Appendable append(CharSequence csq, int start, int end) throws IOException;
    Appendable append(char c) throws IOException;
}

Spring

BeanDefinitionBuilder:

public final class BeanDefinitionBuilder {
    
    public AbstractBeanDefinition getRawBeanDefinition() {
        return this.beanDefinition;
    }
    ...
    public BeanDefinitionBuilder setParentName(String parentName) {
        this.beanDefinition.setParentName(parentName);
        return this;
    }
    
    public BeanDefinitionBuilder setFactoryMethod(String factoryMethod) {
        this.beanDefinition.setFactoryMethodName(factoryMethod);
        return this;
    }

    public BeanDefinitionBuilder setScope(String scope) {
        this.beanDefinition.setScope(scope);
        return this;
    }

    ...
        
    public BeanDefinitionBuilder addPropertyValue(String name, Object value) {
        this.beanDefinition.getPropertyValues().add(name, value);
        return this;
    }
    ...
}

AbstractBeanDefinition:

public abstract class AbstractBeanDefinition extends BeanMetadataAttributeAccessor
        implements BeanDefinition, Cloneable {
    
    protected AbstractBeanDefinition(BeanDefinition original) {
        setParentName(original.getParentName());
        setBeanClassName(original.getBeanClassName());
        setScope(original.getScope());
        setAbstract(original.isAbstract());
        setFactoryBeanName(original.getFactoryBeanName());
        setFactoryMethodName(original.getFactoryMethodName());
        setRole(original.getRole());
        setSource(original.getSource());
        copyAttributesFrom(original);
        ...
    }
}

BeanDefinition:

public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {
    void setParentName(String parentName);
    void setFactoryMethod(String factoryMethod);
    void setFactoryMethodOnBean(String factoryMethod, String factoryBean);
    void addConstructorArgValue(@Nullable Object value);
    void addConstructorArgReference(String beanName);
    void addPropertyValue(String name, @Nullable Object value);
}

简单使用示例

创建角色

简化模式

将角色==Director==与==Client==共用,以达到一种链式调用的编程

上一篇 下一篇

猜你喜欢

热点阅读