JAVA的23种设计模式---建造者模式

来源:互联网 发布:帕拉卡斯人知乎 编辑:程序博客网 时间:2024/05/17 01:49

概要:

该文章参考了《设计模式之禅》一书及一些前辈的博客文章

1.该文章阐述了建造者模式的基础原理及示例代码;
2.该文章适合初学设计模式的技术人员研习;
3.该文章有许多不足之处,请各位大咖指正,喷子绕道;

正文:

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

1.建造者模式示例代码实现:

抽象产品类:

import java.util.ArrayList;/** * 抽象产品类 * @author Administrator * */public abstract class ProductModel {    //有序集合存储产品组装步骤    private ArrayList<String> sequence = new ArrayList<String>();       //第一步    public abstract void firstStep();       //第二步    public abstract void secondStep();      //第三步    public abstract void thirdStep();       //第四步    public abstract void fourthStep();      //模板模式组装步骤    final public void combination(){                for(int i = 0 ; i < this.sequence.size() ; i++){                        String stepName = this.sequence.get(i);             //根据客户定的实际步骤来组装            if("step1".equalsIgnoreCase(stepName)){                this.firstStep();            }else if("step2".equalsIgnoreCase(stepName)){                this.secondStep();            }else if("step3".equalsIgnoreCase(stepName)){                this.thirdStep();            }else if("step4".equalsIgnoreCase(stepName)){                this.fourthStep();            }                   }                   }    //获得客户指定的实际操作步骤的方法    final public void setSequence(ArrayList<String> sequence){        this.sequence = sequence;    }}

具体产品类:

/** * 具体的第一种产品类 * @author Administrator * */public class FirstProduct extends ProductModel{    //第一种产品组装的第一步的实际操作方法    @Override    public void firstStep() {        System.out.println("组装第一种产品的第一步");    }    //第一种产品组装的第二步的实际操作方法    @Override    public void secondStep() {        System.out.println("组装第一种产品的第二步");    }    //第一种产品组装的第三步的实际操作方法    @Override    public void thirdStep() {        System.out.println("组装第一种产品的第三步");    }    //第一种产品组装的第四步的实际操作方法    @Override    public void fourthStep() {        System.out.println("组装第一种产品的第四步");    }}
/** * 具体的第二种产品类 * @author Administrator * */public class SecondProduct extends ProductModel{    //第二种产品组装的第一步的实际操作方法    @Override    public void firstStep() {        System.out.println("组装第二种产品的第一步");    }    //第二种产品组装的第二步的实际操作方法    @Override    public void secondStep() {        System.out.println("组装第二种产品的第二步");    }    //第二种产品组装的第三步的实际操作方法    @Override    public void thirdStep() {        System.out.println("组装第二种产品的第三步");    }    //第二种产品组装的第四步的实际操作方法    @Override    public void fourthStep() {        System.out.println("组装第二种产品的第四步");    }}

抽象建造者类:

import java.util.ArrayList;/** * 抽象建造者(可以理解为抽象工厂) * @author Administrator * */public interface Builder {    //传入客户指定的实际操作步骤的抽象方法    public abstract void setSequence(ArrayList<String> sequence);    //获得产品的抽象方法    public abstract ProductModel getProductModel();}

建造者类:

import java.util.ArrayList;/** * 第一种产品的具体建造者(可以理解为生产第一种产品的具体工厂) * @author Administrator * */public class FirstBuilder implements Builder{    //创建第一种产品的实体对象    private FirstProduct firstProduct = new FirstProduct();    //传入第一种产品的操作步骤    @Override    public void setSequence(ArrayList<String> sequence) {        this.firstProduct.setSequence(sequence);    }    //获得第一种产品    @Override    public ProductModel getProductModel() {        return this.firstProduct;    }}
import java.util.ArrayList;/** * 第二种产品的具体建造者(可以理解为生产第二种产品的具体工厂) * @author Administrator * */public class SecondBuilder implements Builder{    //创建第二种产品的实体对象    private SecondProduct secondProduct = new SecondProduct();    //传入第二种产品的操作步骤    @Override    public void setSequence(ArrayList<String> sequence) {        this.secondProduct.setSequence(sequence);    }    //获得第二种产品    @Override    public ProductModel getProductModel() {        return this.secondProduct;    }}

指挥建造者:

import java.util.ArrayList;/* * 指挥生产者 * 可以理解为各工厂生产具体某种产品的指挥者或者提出具体生产步骤要求的客户 * 也可以理解为一种生产规范 * 重点是它明确了各种生产步骤顺序,组装顺序不同,对象效能也不同 */public class Engineer {    //集合储存实际组装步骤    private ArrayList<String> sequence = new ArrayList<>();    //获取第一种产品的生产者的实例对象    private FirstBuilder firstBuilder = new FirstBuilder();    //获取第二种产品的生产者的实例对象    private SecondBuilder secondBuilder = new SecondBuilder();    //生产A型号的第一种产品的具体方法    public FirstProduct getFirstProductA(){        System.out.println("A型号的第一种产品开始组装...");        //清空容器        this.sequence.clear();        this.sequence.add("step1");        this.sequence.add("step2");        this.sequence.add("step3");        this.sequence.add("step4");        this.firstBuilder.setSequence(this.sequence);        return (FirstProduct)this.firstBuilder.getProductModel();           }    //生产B型号的第一种产品的具体方法    public FirstProduct getFirstProductB(){        System.out.println("B型号的第一种产品开始组装...");        this.sequence.clear();        this.sequence.add("step4");        this.sequence.add("step3");        this.sequence.add("step2");        this.sequence.add("step1");        this.firstBuilder.setSequence(this.sequence);        return (FirstProduct)this.firstBuilder.getProductModel();           }    //生产A型号的第二种产品的具体方法    public SecondProduct getSecondProductA(){        System.out.println("A型号的第二种产品开始组装...");        this.sequence.clear();        this.sequence.add("step1");        this.sequence.add("step2");        this.sequence.add("step3");        this.sequence.add("step4");        this.secondBuilder.setSequence(this.sequence);        return (SecondProduct)this.secondBuilder.getProductModel();         }    //生产B型号的第二种产品的具体方法    public SecondProduct getSecondProductB(){        System.out.println("B型号的第二种产品开始组装...");        this.sequence.clear();        this.sequence.add("step4");        this.sequence.add("step3");        this.sequence.add("step2");        this.sequence.add("step1");        this.secondBuilder.setSequence(this.sequence);        return (SecondProduct)this.secondBuilder.getProductModel();         }}

模拟生产组装类:

/** * 模拟生产 * @author Administrator * */public class Build {    public static void main(String[] args) {        Engineer build = new Engineer();        /*组装A型号的第一种产品,输出:        A型号的第一种产品开始组装...        组装第一种产品的第一步        组装第一种产品的第二步        组装第一种产品的第三步        组装第一种产品的第四步*/        build.getFirstProductA().combination();        /*组装B型号的第一种产品,输出:        B型号的第一种产品开始组装...        组装第一种产品的第四步        组装第一种产品的第三步        组装第一种产品的第二步        组装第一种产品的第一步*/        build.getFirstProductB().combination();        /*组装A型号的第二种产品,输出:        A型号的第二种产品开始组装...        组装第二种产品的第一步        组装第二种产品的第二步        组装第二种产品的第三步        组装第二种产品的第四步*/        build.getSecondProductA().combination();        /*组装B型号的第二种产品,输出:        B型号的第二种产品开始组装...        组装第二种产品的第四步        组装第二种产品的第三步        组装第二种产品的第二步        组装第二种产品的第一步*/        build.getSecondProductB().combination();        }}

注:
a:建造者模式的核心意义是零件的组装,组装的顺序不同,对象的效能也不同
b:建造者模式与工厂模式的主要区分点在于基本方法的调用顺序安排,工厂方法主要职能是创建

原创粉丝点击