`

设计模式之建造者模式

阅读更多

将一个复杂的对象创建与它的表示分离,是的同样的构建过程可以创建不同的表示。

 

通用类图如下:

 



 

建造模式中主要有如下四个角色:

Prodct产品类:

产品便是建造中的复杂对象

 

抽象建造者:

给出一个或多个抽象接口,规范产品的组件,有子类实现具体组建方法

 

具体建造者:

通常是实现了抽象建造者的方法,并且返回一个组建好的对象

 

Director导演类:

负责安排已有的模块顺序,然后告诉建造者开始建造

 

/**
 *
 * 产品类
 *
 */
public class Product {

}

 

/**
 * 抽象建造者
 */
public abstract class AbstractBuilder {

    // 规范组建逻辑
    protected abstract void bulidPart();

    // 返回建造好的产品
    protected abstract Product createProduct();

}

 

/**
 * 具体的建造者
 * 
 */
public class ConcreteBuilder extends AbstractBuilder {

    /**
     * 
     * @see com.huashao.chapter.chapter11.AbstractBuilder#bulidPart()
     */
    @Override
    protected void bulidPart() {
        // TODO Auto-generated method stub

    }

    /**
     * @return
     * @see com.huashao.chapter.chapter11.AbstractBuilder#createProduct()
     */
    @Override
    protected Product createProduct() {
        // TODO Auto-generated method stub
        return new Product();
    }

}

 

/**
 * 
 * 导演类
 * 
 */
public class Director {

    private AbstractBuilder builder = new ConcreteBuilder();

    public Product buildProduct() {

        builder.bulidPart();

        return builder.createProduct();
    }
}

 

 

建造者模式的使用场景:

1.相同的方法不同的执行顺序,产生不同的结果是可以使用建造者模式

2.多个部件或零件,都可以组装到一个对象中,但是产生的运行结果不相同

2.产品类非常复杂或者产品类中的调用顺序不同产生了不同的效果

 

建造者模式的应用:

小明留级了N年后终于考上大学了,小明报考了计算机专业,因为这个专业可以打Dota,小明跟爸爸说,计算机专业没有电脑不行(多么合理的理由啊保密),小明爸爸就给了小明5000块钱,小明拿着钱去电子城转了一圈发现如果买现成的电脑都在5000元以上,小明跟爸爸说现在5000块钱买不了电脑,小明爸爸说:滚!这下可把小明愁坏了,舍友看到小明在唉声叹气就问发生什么事,小明就把情况更舍友说了一下,舍友说:你可以组装一台电脑啊,我这就要去电子城组装电脑,一起去吧。小明和舍友想电子城飞奔而去........下面上类图

 




 
 

电脑主要评价指标:CPU,硬盘、显示器、内存

 

 

/**
 * 
 * 电脑
 * 
 */
public class Computer {

    private String cpu;

    // 硬盘
    private String disk;

    // 内存
    private String memory;

    // 显示器
    private String display;
    
    

    public Computer() {
    }

    /**
     * @param cpu
     * @param disk
     * @param memory
     * @param display
     */
    public Computer(String cpu, String disk, String memory, String display) {
        this.cpu = cpu;
        this.disk = disk;
        this.memory = memory;
        this.display = display;
    }

    public String getCpu() {
        return cpu;
    }

    public void setCpu(String cpu) {
        this.cpu = cpu;
    }

    public String getDisk() {
        return disk;
    }

    public void setDisk(String disk) {
        this.disk = disk;
    }

    public String getMemory() {
        return memory;
    }

    public void setMemory(String memory) {
        this.memory = memory;
    }

    public String getDisplay() {
        return display;
    }

    public void setDisplay(String display) {
        this.display = display;
    }

}

 

/**
 * 组装电脑的抽象类
 * 
 */
public abstract class BuliderPC {

    protected Computer computer;
    // 选择CPU的品牌
    protected abstract void bulidCpu(String cpu);

    // 组装显示器,输入显示器的品牌
    protected abstract void bulidDisplay(String display);

    // 组装内存条
    protected abstract void bulidMemory(String memory);

    // 组装硬盘
    protected abstract void bulidDisk(String disk);

    // 组装电脑
    protected abstract Computer bulidComputer();
}

 

/**
 * 
 * 
 */
public class ConcreteBulidPc extends BuliderPC {

    public ConcreteBulidPc() {
        computer = new Computer();
    }

    /**
     * @param cpu
     */
    @Override
    protected void bulidCpu(String cpu) {

        computer.setCpu(cpu);
    }

    /**
     * @param display
     */
    @Override
    protected void bulidDisplay(String display) {

        computer.setDisplay(display);
    }

    /**
     * @param memory
     */
    @Override
    protected void bulidMemory(String memory) {

        computer.setMemory(memory);
    }

    /**
     * @param disk
     */
    @Override
    protected void bulidDisk(String disk) {

        computer.setDisk(disk);
    }

    /**
     * @return
     */
    @Override
    protected Computer bulidComputer() {
        // TODO Auto-generated method stub
        return computer;
    }

}

 

/**
 * 
 * 导演类
 * 
 */
public class Director {

    private BuliderPC bulider;

    public Director() {
        bulider = new ConcreteBulidPc();
    }

    public Computer bulidComputer(String cpu, String disk, String memory, String display) {

        bulider.bulidCpu(cpu);
        bulider.bulidDisk(disk);
        bulider.bulidMemory(memory);
        bulider.bulidDisplay(display);

        return bulider.bulidComputer();
    }

}

 

小明和舍友到达电子城,小明跟组装电脑的老板说:老板给你5000块钱给我组装个苹果电脑....老板说:你是小明吧?我从小就看你的笑话....

 

public class Client {

    public static void main(String[] args) {
       
        Director director=new Director();
        
      Computer xiaoming=director.bulidComputer("Apple", "xxx", "xxx", "apple retina");
      
      Computer sheyou=director.bulidComputer("sony", "xxxx", "xxx", "samsung");
      
    }
}

 

其实组装电脑这件事用建造者感觉有点不合适,因为我们完全可以new一个电脑然后挨个赋值吐舌头

 

  • 大小: 23.1 KB
  • 大小: 65.7 KB
  • 大小: 65.5 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics