“為什麼加索引能提升查詢效率”! 我們都認為“加索引”提升查詢效率是理所應當的 竟然還有理由? 該怎麼回答呢? 大家好,我是Mic,一個工作了14年的Java程式員 下麵分析一下這個問題的考察點 考察目標 這是一道原理性的問題,考察求職者對於Mysql中索引的實現原理的理解程度。 一般情況下,考察3 ...
JAVA設計模式-建造者模式
介紹
建造者模式是通過一步一步的步驟構建一個包含多個部件的對象,每個不同的對象都是具有相同的構建過程。適用於複雜對象的構建,用戶不需要知道具體的構建細節,只需要指定對象的類型即可。建造者模式將對象的構建和裝配進行瞭解耦,可以使用不同的構建器,相同的裝配過程構造出不同的對象。
場景
適用於一個複雜的對象,這個對象是由多個對象或者簡單的屬性組合而成,再通過穩定的一系列構造步驟一步步的構造出來。
主要內容
抽象的建造者類(Builder): 為創建一個複雜對象的各個部件指定抽象的介面,但是不實現這些具體部件的創建,每個具體部件的創建由具體的建造者來完成。
具體的建造者類(ConcreteBuilder): 實現上方的Builder介面,並且實現抽象介面裡面每個部件的具體的實現,在部件全部構造完成後也會提供一個返回這個複雜對象的方法。
Director: 構造一個使用了Builder介面的具體的對象,它會調用具體的建造者類來創建具體的複雜對象每個部件,最後返回這個對象。Director裡面不涉及具體的對象的任何信息,只包裝這個複雜對象的各個部件的正確創建並且按照一定的構建順序構建。
Product: 需要被構造的複雜對象。
代碼示例
Computer類
/**
* All rights Reserved, Designed By monkey.blog.xpyvip.top
*
* @version V1.0
* @Package com.xpyvip.designpattern.builder
* @Description: 電腦
* @Author: xpy
* @Date: Created in 2022年09月21日 1:45 下午
*/
public class Computer {
/**
* CPU
*/
private String cpu;
/**
* 主板
*/
private String mainBoard;
/**
* 記憶體
*/
private String memory;
public String getCpu() {
return cpu;
}
public void setCpu(String cpu) {
this.cpu = cpu;
}
public String getMainBoard() {
return mainBoard;
}
public void setMainBoard(String mainBoard) {
this.mainBoard = mainBoard;
}
public String getMemory() {
return memory;
}
public void setMemory(String memory) {
this.memory = memory;
}
}
ComputerBuilder類
/**
* All rights Reserved, Designed By monkey.blog.xpyvip.top
*
* @version V1.0
* @Package com.xpyvip.designpattern.builder
* @Description: 電腦介面
* @Author: xpy
* @Date: Created in 2022年09月21日 1:43 下午
*/
public interface ComputerBuilder {
/**
* 構建CPU
*/
void buildCpu();
/**
* 構建主板
*/
void buildMainBoard();
/**
* 構建記憶體
*/
void buildMemory();
Computer buildComputer();
}
OfficeComputerBuilder類
/**
* All rights Reserved, Designed By monkey.blog.xpyvip.top
*
* @version V1.0
* @Package com.xpyvip.designpattern.builder
* @Description: 辦公電腦
* @Author: xpy
* @Date: Created in 2022年09月21日 1:52 下午
*/
public class OfficeComputerBuilder implements ComputerBuilder {
Computer computer;
public OfficeComputerBuilder() {
this.computer = new Computer();
}
public void buildCpu() {
computer.setCpu("辦公電腦CPU");
}
public void buildMainBoard() {
computer.setMainBoard("辦公電腦主板");
}
public void buildMemory() {
computer.setMemory("辦公電腦記憶體");
}
public Computer buildComputer() {
return computer;
}
}
GameComputerBuilder類
/**
* All rights Reserved, Designed By monkey.blog.xpyvip.top
*
* @version V1.0
* @Package com.xpyvip.designpattern.builder
* @Description: 辦公電腦
* @Author: xpy
* @Date: Created in 2022年09月21日 1:52 下午
*/
public class GameComputerBuilder implements ComputerBuilder {
Computer computer;
public GameComputerBuilder() {
this.computer = new Computer();
}
public void buildCpu() {
computer.setCpu("游戲電腦CPU");
}
public void buildMainBoard() {
computer.setMainBoard("游戲電腦主板");
}
public void buildMemory() {
computer.setMemory("游戲電腦記憶體");
}
public Computer buildComputer() {
return computer;
}
}
ComputerDirector類
/**
* All rights Reserved, Designed By monkey.blog.xpyvip.top
*
* @version V1.0
* @Package com.xpyvip.designpattern.builder
* @Description: 電腦構造指揮者
* @Author: xpy
* @Date: Created in 2022年09月21日 1:58 下午
*/
public class ComputerDirector {
public Computer assemble(ComputerBuilder cb) {
cb.buildCpu();
cb.buildMainBoard();
cb.buildMemory();
return cb.buildComputer();
}
public static void main(String[] args) {
Computer officeComputer = new ComputerDirector().assemble(new OfficeComputerBuilder());
Computer gameComputer = new ComputerDirector().assemble(new GameComputerBuilder());
}
}
擴展
簡化結構
簡化構造結構,可以將ComputerDirector裡面的裝配放到每個Builder裡面,但是這樣會導致每個Builder的職責增加,不符合軟體設計原則中的單一職責原則。
代碼示例
/**
* All rights Reserved, Designed By monkey.blog.xpyvip.top
*
* @version V1.0
* @Package com.xpyvip.designpattern.builder
* @Description: 平板電腦
* @Author: xpy
* @Date: Created in 2022年09月21日 4:30 下午
*/
public class TabletComputerBuilder implements ComputerBuilder {
Computer computer;
public TabletComputerBuilder() {
this.computer = new Computer();
}
public void buildCpu() {
computer.setCpu("平板電腦CPU");
}
public void buildMainBoard() {
computer.setMainBoard("平板電腦主板");
}
public void buildMemory() {
computer.setMemory("平板電腦記憶體");
}
public Computer buildComputer() {
return computer;
}
public Computer assemble() {
this.buildCpu();
this.buildMainBoard();
this.buildMemory();
return this.buildComputer();
}
public static void main(String[] args) {
Computer tabletComputer = new TabletComputerBuilder().assemble();
}
}
第二種創建對象方法
我們創建對象時總會要傳入一些參數,如果每個都是放在構造方法裡面傳入,這樣可能會參數很多,代碼可讀性差,對應不上可能還會導致傳入錯誤,我們可以使用構造者模式並且支持鏈式調用解決參數過多問題。
代碼示例
/**
* All rights Reserved, Designed By monkey.blog.xpyvip.top
*
* @version V1.0
* @Package com.xpyvip.designpattern.builder
* @Description: 工控機
* @Author: xpy
* @Date: Created in 2022年09月21日 4:30 下午
*/
public class IpcComputerBuilder {
Computer computer;
public IpcComputerBuilder() {
this.computer = new Computer();
}
public IpcComputerBuilder buildCpu(String cpu) {
computer.setCpu(cpu);
return this;
}
public IpcComputerBuilder buildMainBoard(String mainBoard) {
computer.setMainBoard("平板電腦主板");
return this;
}
public IpcComputerBuilder buildMemory(String memory) {
computer.setMemory("平板電腦記憶體");
return this;
}
public Computer buildComputer() {
return computer;
}
public static void main(String[] args) {
Computer computer = new IpcComputerBuilder().buildCpu("工控機CPU").buildMainBoard("工控機主板").buildMemory("工控機記憶體").buildComputer();
}
}
原文鏈接:https://monkey.blog.xpyvip.top/archives/java-she-ji-mo-shi---jian-zao-zhe-mo-shi