设计模式 -- 建造者模式(Builder pattern)

封装一个复杂对象的构建过程,可以按照流程来构建对象。

  • 优点:它可以将一个复杂对象的构建与表示相分离,同一个构建过程,可以构成出不同的产品,简化了投建逻辑。

  • 缺点:如果构建流程特别复杂,就是导致这个构建系统过于庞大,不利于控制。

设计模式 -- 建造者模式(Builder pattern)_第1张图片

// 产品类
public class Computer {
    private String cpu;//必须
    private String ram;//必须
    private int usbCount;//可选
    private String keyboard;//可选
    private String display;//可选


    public Computer(String cpu, String ram) {
        this.cpu = cpu;
        this.ram = ram;
    }
    public void setUsbCount(int usbCount) {
        this.usbCount = usbCount;
    }
    public void setKeyboard(String keyboard) {
        this.keyboard = keyboard;
    }
    public void setDisplay(String display) {
        this.display = display;
    }
    @Override
    public String toString() {
        return "Computer{" +
                "cpu='" + cpu + '\'' +
                ", ram='" + ram + '\'' +
                ", usbCount=" + usbCount +
                ", keyboard='" + keyboard + '\'' +
                ", display='" + display + '\'' +
                '}';
    }
}


// 抽象建造者
public abstract class ComputerBuilder {
    public abstract void setUsbCount();
    public abstract void setKeyboard();
    public abstract void setDisplay();


    public abstract Computer getComputer();
}


// 苹果电脑构建者类
public class MacComputerBuilder extends ComputerBuilder {
    private Computer computer;
    public MacComputerBuilder(String cpu, String ram) {
        computer = new Computer(cpu, ram);
    }
    @Override
    public void setUsbCount() {
        computer.setUsbCount(2);
    }
    @Override
    public void setKeyboard() {
        computer.setKeyboard("苹果键盘");
    }
    @Override
    public void setDisplay() {
        computer.setDisplay("苹果显示器");
    }
    @Override
    public Computer getComputer() {
        return computer;
    }
}


// 联想电脑构建者类
public class LenovoComputerBuilder extends ComputerBuilder {
    private Computer computer;
    public LenovoComputerBuilder(String cpu, String ram) {
        computer=new Computer(cpu,ram);
    }
    @Override
    public void setUsbCount() {
        computer.setUsbCount(4);
    }
    @Override
    public void setKeyboard() {
        computer.setKeyboard("联想键盘");
    }
    @Override
    public void setDisplay() {
        computer.setDisplay("联想显示器");
    }
    @Override
    public Computer getComputer() {
        return computer;
    }
}


// 指导者类(Director)
public class ComputerDirector {
    public Computer makeComputer(ComputerBuilder builder){
        builder.setUsbCount();
        builder.setDisplay();
        builder.setKeyboard();
        return builder.getComputer();
    }
}


// 使用
public static void main(String[] args) {
        ComputerDirector director=new ComputerDirector();//1
        ComputerBuilder builder=new MacComputerBuilder("I5处理器","三星125");//2
        Computer macComputer = director.makeComputer(builder);//3
        System.out.println("mac computer:"+macComputer.toString());


        ComputerBuilder lenovoBuilder=new LenovoComputerBuilder("I7处理器","海力士222");
        Computer lenovoComputer=director.makeComputer(lenovoBuilder);
        System.out.println("lenovo computer:"+lenovoComputer.toString());
}



简化版

public class Product {
    private String board;     
    private String display;     
    private String os;     
     
    public String getBoard() {
        return board;     
    }      
    
    public String getDisplay() {         
        return display;     
    }     
     
    public String getOs() {         
        return os;     
    }      
    
    private Product(Builder builder) {         
        // 进行构建         
        this.board = builder.board;         
        this.display = builder.display;         
        this.os = builder.os;     
    }     
     
    public static class Builder {         
        // 建造者模式还可以设置默认值         
        private String board = "default value";         
        private String display = "default value";         
        private String os = "default value";  
                
        public void setBoard(String board) {             
            this.board = board;         
        }         
         
        public void setDisplay(String display) {                 
            this.display = display;         
        }       
           
        public void setOs(String os) {             
            this.os = os;         
        }   
                
        public Product build() {             
            return new Product(this);         
        }     
    } 
}



 根据以下文章总结:

  1. Java设计模式:23种设计模式全面解析(超级详细)HYPERLINK http://c.biancheng.net/design_pattern/ n委派模式在JDK以及Spring源码中的应用_蒙奇D灬小武的博客-CSDN博客

  2. 3种设计模式详解 https://www.iteye.com/blog/zz563143188-1847029 

  3. Android系统编程思想:设计模式https://github.com/sucese/android-open-source-project-analysis/blob/master/doc/Android%E7%B3%BB%E7%BB%9F%E8%BD%AF%E4%BB%B6%E8%AE%BE%E8%AE%A1%E7%AF%87/02Android%E7%B3%BB%E7%BB%9F%E8%BD%AF%E4%BB%B6%E8%AE%BE%E8%AE%A1%E7%AF%87%EF%BC%9A%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F.md#35-%E8%A7%82%E5%AF%9F%E8%80%85%E6%A8%A1%E5%BC%8F

  4. 设计模式 https://blog.csdn.net/shusheng0007/category_8638565.html 永不磨灭的设计模式(有这一篇真够了,拒绝标题党)_ShuSheng007的博客-CSDN博客_永不磨灭的设计模式

  5. java设计模式 https://blog.csdn.net/qq_37909508/category_8976362.html

  6. 设计模式 设计模式 - 随笔分类 - 左潇龙 - 博客园

  7. 设计模式 在源码中的应用 https://blog.csdn.net/qq_36970993/category_10620886.html

  8. Android系统设计中存在设计模式分析 https://www.2cto.com/kf/201208/150650.html

  9. Android设计模式系列 - 基于android的各种代码分析各种设计模式 https://www.cnblogs.com/qianxudetianxia/category/312863.html 

你可能感兴趣的:(设计模式,设计模式)