Java设计模式之建造者模式

耗尽温柔 提交于 2020-01-28 00:00:32

建造者设计模式:

使用多个简单的对象一步构建一个复杂的对象,这种类型的设计模式属于创建者模式。

介绍:

意图:将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

主要解决:有时候面临一个复杂对象的创建工作,其通常由各个部分的子对象使用一定的算法构成,由于需求的改变,这个复杂的对象的各个部分经常面临着剧烈的变化,但是将他们组合在一起的算法去相对稳定。

何时使用:一些基本不会变,而其组合经常变化的时候。

关键代码:建造者:创建和提供实例,导演:管理创建出来的实例的依赖关系。

应用实例:1去肯德基,可乐,汉堡以及鸡翅是不会变化的,但是客户点餐的套餐组合是不一样的。

优点:1建造者独立,容易扩展。2便于控制细节风险。

缺点:1产品必须具有共同点,范围有限制。2如果内部变化复杂,会导致有很多建造类。

使用场景:1需要生成的对象具有复杂的内部结构。2需要生成的对象内部属性本身相互依赖。

 

注意事项:与工厂模式不同,建造者模式更加强调零件之间的装配的顺序。

 

 

模式角色:

建造者角色:定义生成实例所需要的所有方法。

具体的建造者角色:实现生成实例所需要的所有方法,并且定义获取最终实例的方法。

监工角色:定义使用建造者角色中的方法来生成实例的方法。

使用者:使用建造者模式。

 

uml图:

Product类

import java.util.ArrayList;
import java.util.List;

//Product类,由多个部件组成。
public class Product {
    List<String> parts=new ArrayList<>();
    //添加产品部件
    public void add(String part){
        parts.add(part);
    }
    
    //列举所有的产品部件
    public void show(){
        System.out.println("\n 产品创建---------");
        for (String item : parts) {
            System.out.println(item);
        }
    }
}

Builder类:

//抽象建造类,确定产品由两个部件构成,parta,partb组成,
//并声明一个得到产品建造类结果的方法
public abstract class Builder {
    public abstract void buildPartA();
    public abstract void buildPartB();
    public abstract Product getResult();
}

ConcreteBulider类:

//具体的建造类
public class ConcreteBuilder1 extends Builder{

    private Product product=new Product();
    @Override
    public void buildPartA() {
        // TODO 自动生成的方法存根
        product.add("部件A");
    }

    @Override
    public void buildPartB() {
        // TODO 自动生成的方法存根
        product.add("部件B");
    }

    @Override
    public Product getResult() {
        // TODO 自动生成的方法存根
        return product;
    }

}
public class ConcreteBuilder2 extends Builder{

    private Product product=new Product();
    @Override
    public void buildPartA() {
        // TODO 自动生成的方法存根
        product.add("部件X");
    }

    @Override
    public void buildPartB() {
        // TODO 自动生成的方法存根
        product.add("部件Y");
    }

    @Override
    public Product getResult() {
        // TODO 自动生成的方法存根
        return product;
    }

}

Director类:

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

客户端代码:

public class Client {

    //客户不需要知道具体的建造过程。
    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        Director director=new Director();
        Builder builder=new ConcreteBuilder1();
        Builder builder2=new ConcreteBuilder2();
        //指挥者用concretebuilder的方法来建造产品。
        director.Construct(builder);
        Product p1=builder.getResult();
        p1.show();
        director.Construct(builder2);
        Product product=builder2.getResult();
        product.show();
        System.out.println("==========");
    }
}

总结:

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

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!