标签:get 设计原则 bst 学习 定义 bsp 改变 用户 ring
前言:继续学习设计模式,今天学习建造者模式。
又叫生成器模式。将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
依赖倒转原则,抽象不应该依赖细节,细节应该依赖抽象。
如果我们用了建造者模式,那么用户就只需要指定需要建造的类型就可以得到他们,而具体建造的过程和细节就不需要知道了。
主要用于创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的(产品对象具有共性),但对象内部的构建通常面临着复杂的变化。
使得建造者代码与表示代码分离,达到解耦。
由于建造者隐藏了该产品是如何组装的,所以若要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了,符合“开闭原则”。
将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,易于精确控制对象的创建。
建造者模式所创建的产品一般具有较多的共同点,其组成部分相似;如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。
如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。
具体产品
package designpatterns.builder; import java.util.ArrayList; import java.util.List; /** * 具体产品 * @author yule * @date 2018/8/12 13:32 */ public class Product { private List<String> parts = new ArrayList<>(); /** * 添加产品部件 * @param part */ public void addPart(String part){ parts.add(part); } /** * 列举所有产品部件 */ public void show(){ System.out.println("产品创建:"); for(String part : parts){ System.out.println(part); } } }
创建抽象建造者,假设一个产品需要partA,partB组成
package designpatterns.builder; /** * 抽象建造者 * @author yule * @date 2018/8/12 13:36 */ public abstract class Builder { public abstract void builderPartA(); public abstract void builderPartB(); public abstract Product getProduct(); }
创建具体建造者1
package designpatterns.builder; /** * 具体建造者1 * @author yule * @date 2018/8/12 13:37 */ public class ConcreteBuilder1 extends Builder{ private Product product = new Product(); @Override public void builderPartA() { product.addPart("部件A1"); } @Override public void builderPartB() { product.addPart("部件B1"); } @Override public Product getProduct() { return product; } }
创建具体建造者2
package designpatterns.builder; /** * 具体建造者2 * @author yule * @date 2018/8/12 13:39 */ public class ConcreteBuilder2 extends Builder{ private Product product = new Product(); @Override public void builderPartA() { product.addPart("部件A2"); } @Override public void builderPartB() { product.addPart("部件B2"); } @Override public Product getProduct() { return product; } }
创建指挥者,用来指挥创建过程
package designpatterns.builder; /** * 指挥者,用来指挥创建过程 * @author yule * @date 2018/8/12 13:40 */ public class Director { public void Construct(Builder builder){ builder.builderPartA(); builder.builderPartB(); } }
客户端代码,客户不需要知道具体的建造过程
public static void main(String[] args){ Director director = new Director(); Builder builder1 = new ConcreteBuilder1(); director.Construct(builder1); Product product1 = builder1.getProduct(); product1.show(); Builder builder2 = new ConcreteBuilder2(); director.Construct(builder2); Product product2 = builder2.getProduct(); product2.show(); }
标签:get 设计原则 bst 学习 定义 bsp 改变 用户 ring
原文地址:https://www.cnblogs.com/yuxiaole/p/9462784.html