什麼是建造者模式呢,顧名思義,把某個東西建立出來,說得準確點是,把各類部件按照須要的方式建形成一個產品。建造者模式須要四個類,抽象建造者,具體建造者,產品類,導演類。java
public class Phone { //手機的部件 private String cpu; private String screen; private String camera; //對部件的邏輯處理 public void setCpu(String cpu) { this.cpu = cpu; } public void setScreen(String screen) { this.screen = screen; } public void setCamera(String camera) { this.camera = camera; } public String use() { return "Phone{" + "cpu='" + cpu + '\'' + ", screen=" + screen + ", camera=" + camera + '}'; } }
public abstract class AbstractBuilder { //多個部件供咱們組合成不一樣的產品 public abstract void midCpu(); public abstract void midScreen(); public abstract void midCamera(); public abstract void topCpu(); public abstract void topScreen(); public abstract void topCamera(); //組合完成後返回產品類 public abstract Phone buildPhone(); }
注意並非具體的產品,而是具體的廠商,生產不一樣品牌部件的建造者,在本例中有兩個具體建造者類,一個是生產一加的各部件,一個是生產魅族的各部件。ide
public class OnePlusBuilder extends AbstractBuilder { Phone phone = new Phone(); @Override public void midCpu() { phone.setCpu("一加高配處理器"); } @Override public void midScreen() { phone.setScreen("一加高配屏幕"); } @Override public void midCamera() { phone.setCamera("一加高配相機"); } @Override public void topCpu() { phone.setCpu("一加頂配處理器"); } @Override public void topScreen() { phone.setScreen("一加頂配屏幕"); } @Override public void topCamera() { phone.setCamera("一加頂配相機"); } @Override public Phone buildPhone() { return phone; } }
public class MeizuBuilder extends AbstractBuilder { Phone phone = new Phone(); @Override public void midCpu() { phone.setCpu("魅族中配處理器"); } @Override public void midScreen() { phone.setScreen("魅族中配屏幕"); } @Override public void midCamera() { phone.setCamera("魅族中配相機"); } @Override public void topCpu() { phone.setCpu("魅族高配處理器"); } @Override public void topScreen() { phone.setScreen("魅族高配屏幕"); } @Override public void topCamera() { phone.setCamera("魅族高配相機"); } @Override public Phone buildPhone() { return phone; } }
導演嘛,很形象,指揮要建造什麼具體的產品測試
public class Director { AbstractBuilder builder; public Director(AbstractBuilder builder) { this.builder = builder; } public Phone buildMidPhone() { builder.midCpu(); builder.midCamera(); builder.midScreen(); return builder.buildPhone(); } public Phone buildTopPhone() { builder.topCpu(); builder.topCamera(); builder.topScreen(); return builder.buildPhone(); } }
如今不是都說手機是堆料嘛,導演類就負責,我可以用不一樣的料,甚至一樣的料不一樣的堆積方法來給你堆出不一樣的產品。ui
像上面的例子中,我有6個部件,可是不一樣的部件我可以生產不一樣的產品。this
public class Test { public static void main(String[] args) { Director director = new Director(new OnePlusBuilder()); System.out.println(director.buildMidPhone().use()); System.out.println(director.buildTopPhone().use()); director = new Director(new MeizuBuilder()); System.out.println(director.buildMidPhone().use()); System.out.println(director.buildTopPhone().use()); } }
二者比較類似,可是不一樣的點仍是比較清晰。spa