人物:小菜,大鸟
事件:小菜和大鸟去吃宵夜,小菜吃了一碗很香的炒面,然后大鸟想吃也叫了一碗,但发现这一碗却没有放盐,为什么同一个厨师做两次炒面,第一碗好吃,第二碗却不好吃呢,为什么像肯德基麦当劳这样虽然分布全国各地,但是做出来的味道却几乎一样呢,大鸟借此引出了设计模式中的建造者模式
建造者模式:
1.建造者模式结构图
2.举例说明建造者模式
3.实现建造者模式的基本代码
建造者模式结构图
什么是建造者模式?
以一个建模举例,当需要你构建一个胖的人和一个瘦的人,如果依次建一个人的头,手,肚子,脚等,可能会因为粗心导致缺胳膊少腿,而且每次建造人的需求可能不一样,有的要求瘦点的,有的要求手长一点的,那么如果按照各个部位依次敲代码建造,每次都有失误的风险,所以要像麦当劳肯德基那样将食品加工的流程抽象出来,也把构建一个人的流程抽象出来,那么构建人的部位是一套完整的流程,就不会缺胳膊少腿了。
也就是说,建造一个人的过程是稳定的:头手脚等,构建人的细节是不同的:高矮胖瘦。这样将一个复杂对象的构建和它的表示分离,使得同样的构建过程能够创建不同的表示意图,这也称为建造者模式。
建造者的基本代码
Product类 -- 产品类
@Slf4j public class Product { List<String> parts = new ArrayList(); public void add(String part) { parts.add(part); } public void show(){ log.info("产品,创建: "); for(String s: parts) { log.info(s); } } }
Builder类 -- 抽象建造者类:确定产品有A,B两个部件构成,最后用getResult()方法得到产品
public abstract class Builder { public abstract void buildPartA(); public abstract void buildPratB(); public abstract Product getResult(); }
ConcreteBuilder1和ConcreteBuilder2类是具体的建造者类
public class ConcreteBuilder1 extends Builder { private Product product = new Product(); @Override public void buildPartA() { product.add("部件A"); } @Override public void buildPratB() { product.add("部件B"); } @Override public Product getResult() { return product; } }
public class ConcreteBuilder2 extends Builder { private Product product = new Product(); @Override public void buildPartA() { product.add("部件X"); } @Override public void buildPratB() { product.add("部件Y"); } @Override public Product getResult() { return product; } }
Director类 -- 指挥者类
public class Director { public void construct(Builder builder) { builder.buildPartA(); builder.buildPratB(); } }
客户端代码调用:
public static void main(String[] args) { Director director = new Director(); Builder b1 = new ConcreteBuilder1(); Builder b2 = new ConcreteBuilder2(); director.construct(b1); Product p1 = b1.getResult(); p1.show(); director.construct(b2); Product p2 = b2.getResult(); p2.show(); }
小结:所以,建造者模式是,在当创建复杂对象的算法,应该独立于该对象的组成部分,以及它们的装配方式时适用的模式