`

java 设计模式--建造者模式

    博客分类:
  • java
阅读更多

Builder 模式 —— 建造者模式(又译成生成器模式的主要功能是构建复杂的产品,它是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

举个例子,打个生产电脑的比方,这里简单一点,假设生产电脑只需要 CUP、内存和显卡,现在需要生产宏基和戴尔两个品牌的电脑,不用设计模式的实现:

Acer.java


import java.util.ArrayList;
import java.util.List;
/**
 * -----------------------------------------
 * @描述  生产宏基笔记本电脑
 * @作者  fancy
 * @邮箱  fancydeepin@yeah.net
 * @日期  2012-8-4 <p>
 * -----------------------------------------
 
*/

public class Acer{

    protected List<String> parts = new ArrayList<String>();
    
    //生产CPU
    public void createCPU() {
        
        parts.add("CUP: Intel 酷睿i3 2350M");
    }


    //生产内存
    public void createMemory() {

        parts.add("内存: 4GB DDR3 1333MHz");
    }


    //生产显卡
    public void createDisplayCard() {

        parts.add("显卡: NVIDIA GeForce GT 520M");
    }

    
    //显示产品信息
    public void show(){
        System.out.print("产品部件信息:");
        for(String part : parts){
            System.out.print(part + "\t");
        }

    }


}



Dell.java


import java.util.ArrayList;
import java.util.List;
/**
 * -----------------------------------------
 * @描述  生产戴尔笔记本电脑
 * @作者  fancy
 * @邮箱  fancydeepin@yeah.net
 * @日期  2012-8-4 <p>
 * -----------------------------------------
 
*/

public class Dell{

    protected List<String> parts = new ArrayList<String>();

    //生产CPU
    public void createCPU() {

        parts.add("CUP: Intel 酷睿i7 3612QM");
    }


    //生产内存
    public void createMemory() {

        parts.add("内存: 8GB DDR3 1600MHz");
    }


    //生产显卡
    public void createDisplayCard() {

        parts.add("显卡: NVIDIA GeForce GT 640M+Intel GMA HD 4000");
    }


    //显示产品信息
    public void show(){
        System.out.print("产品部件信息:");
        for(String part : parts){
            System.out.print(part + "\t");
        }

    }


}



Client.java


/**
 * -----------------------------------------
 * @描述  客户端测试
 * @作者  fancy
 * @邮箱  fancydeepin@yeah.net
 * @日期  2012-8-4 <p>
 * -----------------------------------------
 
*/

public class Client {

    private static Acer acer = new Acer();
    private static Dell dell = new Dell();
    
    public static void main(String[] args){

        /**
         * 宏基
         
*/

        acer.createCPU();
        acer.createMemory();
        acer.createDisplayCard();
        acer.show();
        
        /***************************************/
        System.out.println();
        /***************************************/
        
        /**
         * 戴尔
         
*/

        dell.createCPU();
        dell.createMemory();
        dell.createDisplayCard();
        dell.show();
    }

    
}



仔细观察一下上面的实现,不难发现,不管是生产何种品牌的笔记本,在实现的时候,它们的步骤基本上都是一样的,都是生产电脑相应的部件并添加都电脑里面,在生产不同品牌电脑

的时候,都会重复处理这几个步骤,但是明显的是,这几个步骤都是稳定的或者说是一样的,只是每个步骤的具体实现不一样或者说是变化的,如果将这些变化的部分抽取出来,也就是

说如果将处理过程与具体的步骤的实现分离开来的话,这样就能够复用这些处理过程,而且这样一来就能很容易的做到在不同品牌电脑之间切换生产。

使用 Builder 模式的实现,如图:


Product.java


package pattern.builder;

import java.util.ArrayList;
import java.util.List;
/**
 * -----------------------------------------
 * @描述  抽象产品
 * @作者  fancy
 * @邮箱  fancydeepin@yeah.net
 * @日期  2012-8-5 <p>
 * -----------------------------------------
 
*/

public abstract class Product {

    protected List<String> parts = new ArrayList<String>();
    
    //添加部件
    public void add(String part){
        parts.add(part);
    }


    //显示产品信息
    public void show(){
        System.out.print("产品部件信息:");
        for(String part : parts){
            System.out.print(part + "\t");
        }

    }

}



Acer.java


package pattern.builder;
/**
 * -----------------------------------------
 * @描述  宏基笔记本
 * @作者  fancy
 * @邮箱  fancydeepin@yeah.net
 * @日期  2012-8-5 <p>
 * -----------------------------------------
 
*/

public class Acer extends Product{

    //Do other things here
    
}



Dell.java


package pattern.builder;
/**
 * -----------------------------------------
 * @描述  戴尔笔记本
 * @作者  fancy
 * @邮箱  fancydeepin@yeah.net
 * @日期  2012-8-5 <p>
 * -----------------------------------------
 
*/

public class Dell extends Product{

    //Do other things here
    
}



Builder.java


package pattern.builder;
/**
 * -----------------------------------------
 * @描述  抽象建造者
 * @作者  fancy
 * @邮箱  fancydeepin@yeah.net
 * @日期  2012-8-5 <p>
 * -----------------------------------------
 
*/

public interface Builder {

    //CUP
    public void buildCPU();
    
    //内存
    public void buildMemory();
    
    //显卡
    public void buildDisplayCard ();
    
    //最终产品
    public Product getFinalResult();
    
}



AcerBuilder.java


package pattern.builder;
/**
 * -----------------------------------------
 * @描述  宏基笔记本建造者
 * @作者  fancy
 * @邮箱  fancydeepin@yeah.net
 * @日期  2012-8-5 <p>
 * -----------------------------------------
 
*/

public class AcerBuilder implements Builder {

    private Product product = new Acer();
    
    @Override
    public void buildCPU() {
        
        product.add("CUP: Intel 酷睿i3 2350M");
    }


    @Override
    public void buildMemory() {

        product.add("内存: 4GB DDR3 1333MHz");
    }


    @Override
    public void buildDisplayCard() {

        product.add("显卡: NVIDIA GeForce GT 520M");
    }


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


}



DellBuilder.java


package pattern.builder;
/**
 * -----------------------------------------
 * @描述  戴尔笔记本建造者
 * @作者  fancy
 * @邮箱  fancydeepin@yeah.net
 * @日期  2012-8-5 <p>
 * -----------------------------------------
 
*/

public class DellBuilder implements Builder {

    private Product product = new Dell();
    
    @Override
    public void buildCPU() {
        
        product.add("CUP: Intel 酷睿i7 3612QM");
    }


    @Override
    public void buildMemory() {

        product.add("内存: 8GB DDR3 1600MHz");
    }


    @Override
    public void buildDisplayCard() {

        product.add("显卡: NVIDIA GeForce GT 640M+Intel GMA HD 4000");
    }


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


}



Director.java


package pattern.builder;
/**
 * -----------------------------------------
 * @描述  产品构建指导者
 * @作者  fancy
 * @邮箱  fancydeepin@yeah.net
 * @日期  2012-8-5 <p>
 * -----------------------------------------
 
*/

public class Director {

    private Builder builder;
    
    public Director(Builder builder){
        this.builder = builder;
    }

    
    public void construct(){
        
        builder.buildCPU();
        builder.buildMemory();
        builder.buildDisplayCard();
    }

}



Client.java


package pattern.builder;
/**
 * -----------------------------------------
 * @描述  客户端测试
 * @作者  fancy
 * @邮箱  fancydeepin@yeah.net
 * @日期  2012-8-5 <p>
 * -----------------------------------------
 
*/

public class Client {

    
private static Builder acerBuilder = new AcerBuilder(),
                                                dellBuilder  
= new DellBuilder();
    
    
public static void main(String[] args){
        
        System.out.print(
"宏基");
        Director director 
= new Director(acerBuilder);
        director.construct();
        Product product 
= acerBuilder.getFinalResult();
        product.show();
        
        
/***************************************/
        System.out.println();
        
/***************************************/
        
        System.out.print(
"戴尔");
        director 
= new Director(dellBuilder);
        director.construct();
        product 
= dellBuilder.getFinalResult();
        product.show();
    }

    
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics