设计模式之建造者模式
将一个复杂的对象创建与它的表示分离,是的同样的构建过程可以创建不同的表示。
通用类图如下:
建造模式中主要有如下四个角色:
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一个电脑然后挨个赋值