设计模式:建造者模式

如果需要将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示,这个时候就需要应用一个设计模式,“建造者模式”,又叫生成器模式。如果我们用了建造者模式,那么用户就只需指定需要建造的类型就可以得到它们,而具体建造的过程和细节就不需知道。

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

下面给出建造者模式结构图

这里面我觉比较重要的是指挥者,指挥者负责了构建的顺序。
使用场景
1,主要是用于创建一些复杂的对象,这些对象内部构建间的构造顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化。
2,遇到多个构造器参数时使用构造者模式。具体参考《Effective Java》第二条。

下面用代码推演一下构造着模式

import java.util.ArrayList;

/**
 * Created by Kode on 2018/11/19.
 */
class Product {
    ArrayList<String> parts = new ArrayList<String>();
    public void add(String part) {
        parts.add(part);
    }
    public void show() {
        for(String str : parts) {
            System.out.println(str);
        }
    }
}

// Bulid 类
abstract class Builder {
    public abstract void buildPartA();
    public abstract void buildPartB();
    public abstract Product getResult();
}

//创建具体类1
class ConcreteBuilder1 extends Builder {
    private Product product = new Product();
    @Override
    public void buildPartA() {
        product.add("部件A");
    }

    @Override
    public void buildPartB() {
        product.add("部件B");
    }

    @Override
    public Product getResult() {
        return product;
    }
}
//创建具体类2
class ConcreteBuilder2 extends Builder {
    private Product product = new Product();
    @Override
    public void buildPartA() {
        product.add("部件X");
    }

    @Override
    public void buildPartB() {
        product.add("部件Y");
    }

    @Override
    public Product getResult() {
        return product;
    }
}

//创建指挥者类
class Director {
    public void Construct(Builder builder) {
        builder.buildPartA();
        builder.buildPartB();
    }
}

public class Builder1 {
    public static void main(String[] args){
        Director director = new Director();
        ConcreteBuilder1 concreteBuilder1 = new ConcreteBuilder1();
        ConcreteBuilder2 concreteBuilder2 = new ConcreteBuilder2();
        director.Construct(concreteBuilder1);
        Product result = concreteBuilder1.getResult();
        result.show();
        director.Construct(concreteBuilder2);
        Product result1 = concreteBuilder2.getResult();
        result1.show();
    }
}

说点什么

avatar
  Subscribe  
提醒

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部