建造者模式

一、简介

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

二、组成

建造者模式可以有以下成员构成

Builder:抽象接口,规范产品对象各个组成成分的建造。这个接口规定要实现的复杂对象的创建流程,并不涉及具体的对象组件的创建。

ConcreteBuilder:实现Builder接口,具体的构建者,负责构建和装配各个部件。

Product:产品角色

Director:调用具体建造者来创建复杂对象的各个部分,其中不涉及具体产品构建信息,只负责产品各个部分按照创建流程创建。

三、UML类图

四、示例代码

public class Director {
    
    public void Construct(Builder builder){
        builder.buildPartA();
        builder.buildPartB();
    }
    
    static class Product{
        List<String> parts=new ArrayList<>();
        
        public void add(String part){
            parts.add(part);
        }
        
        public void show(){
            System.out.println(" Product build-----");
            for (String part : parts) {
                System.out.println(part);
            }
        }
    }
    
    static abstract class Builder{
        public abstract void buildPartA();
        public abstract void buildPartB();
        public abstract Product getResult();
    }

    static class ConcreteBuilder1 extends Builder{

        private Product product=new Product();
        
        @Override
        public void buildPartA() {
            product.add("part A");
        }

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

        @Override
        public Product getResult() {
            return product;
        }
    }
    
    static class ConcreteBuilder2 extends Builder{

        private Product product=new Product();
        
        @Override
        public void buildPartA() {
            product.add("part X");
        }

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

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

    public static void main(String[] args) {
        Director director=new Director();
        Builder b1=new ConcreteBuilder1();
        Builder b2=new ConcreteBuilder2();
        
        director.Construct(b1);
        Product p1=b1.getResult();
        p1.show();
        
        director.Construct(b2);
        Product p2=b2.getResult();
        p2.show();
    }
}

 

五、优点与适用场景

优点:

1、客户端可以不必知道产品的具体构建过程

2、具体的构造者类之间是相互独立的

3、对具体的构造者的构建过程的逐步细化不会对其他模块产生影响。

适用场景:

1、创建一些复杂的对象时,这些对象的内部组成构件间的建造顺序是稳定的,但内部组成构件面临着复杂的变化。

2、当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式

posted @ 2017-03-20 22:15  戎码之路  阅读(175)  评论(0编辑  收藏  举报