3.4 建造者模式

建造者模式是什么?

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

 

这里不禁会有疑问,将复杂对象的构建与其表示相分离,我们前面不是使用工厂方法模式可以实现了吗?可见,构造者模式不是为解决这个问题而生的。那它到底要解决什么问题呢?它是通过相同的构建过程创建不同的表示。也就是说,对象是创建出来的,但是返回的对象的属性是不同的。

 

UML类图:

 

 

类图代码:

 

Product
public interface Product {
    public void addPart(String part) ;
    public void showProduct();
}
ConcreteProductA
public class ConcreteProductA implements Product{
    private List<String> parts = new ArrayList<String>();
    
    public void addPart(String part){ 
        parts.add(part); 
    }
    public void showProduct(){ 
        for(String str : parts){ 
            System.out.println("ConcreteProductA:" + str); 
        } 
    } 
}
ConcreateProductB
public class ConcreateProductB implements Product {
    public void operation1() {
        System.out.println("ConcreateProductB -> operation1");
    }

    public void operation2() {
        System.out.println("ConcreateProductB -> operation2");
    }
}
AbstractBuilder
public interface AbstractBuilder {
    public void addPartA();
    public void addPartB();
    public Product build();
}
ConcreteBuilderA
public class ConcreteBuilderA implements AbstractBuilder {
    private Product product = new ConcreteProductA();
    
    public void addPartA() {
        product.addPart("具体类 A 的组件 A"); 
    }

    public void addPartB() {
        product.addPart("具体类 A 的组件 B"); 
    }

    public Product build() {
        return product; 
    }
}
ConcreteBuilderB
public class ConcreteBuilderB implements AbstractBuilder {
    private Product product = new ConcreteProductB();
    
    public void addPartA() {
        product.addPart("具体类B 的组件 A"); 
    }

    public void addPartB() {
        product.addPart("具体类B 的组件 B"); 
    }

    public Product build() {
        return product;
    }
}
Client
public class Client {
    public static void main(String[] args) {
        //定义一个组装产品
        AbstractBuilder buiderA = new ConcreteBuilderA();
        buiderA.addPartA();
        buiderA.addPartB();
        Product productA = buiderA.build();
        productA.showProduct();
        
        AbstractBuilder buiderB = new ConcreteBuilderB();
        buiderB.addPartA();
        buiderB.addPartB();
        Product productB = buiderB.build();
        productB.showProduct();
    }
}
执行结果
ConcreteProductA:具体类 A 的组件 A
ConcreteProductA:具体类 A 的组件 B
ConcreteProductB:具体类B 的组件 A
ConcreteProductB:具体类B 的组件 B

 

建造者模式应用于哪些场景?

(1)对象的构造复杂且具有不确定性,最终都获取到了相同类型的对象,但是各个对象的属性不一样。

posted on 2012-05-19 17:32  随心浪子  阅读(160)  评论(0编辑  收藏  举报

导航