Builder:建造者模式
先代码
产品类:
package h.l.demo.builder;
import java.util.ArrayList;
import java.util.List;
/**
*
* @author: Is-Me-Hl
* @date: 2020年2月25日
* @Description: 产品类
*/
public class Product {
List<String> parts = new ArrayList<>();
public void add(String part) {
parts.add(part);
}
public void show() {
System.out.println("产品创建 ----");
for (String part : parts) {
System.out.println(part + " ");
}
}
}
抽象类或接口:
package h.l.demo.builder;
/**
*
* @author: Is-Me-Hl
* @date: 2020年2月25日
* @Description: 抽象类
*/
public abstract class Builder {
public abstract void builderPartA();
public abstract void builderPartB();
public abstract Product getProduct();
}
子类或实现类(两个):
package h.l.demo.builder;
/**
*
* @author: Is-Me-Hl
* @date: 2020年2月25日
* @Description: 具体建造者类1
*/
public class ConcreteBuilder1 extends Builder {
private Product product = new Product();
@Override
public void builderPartA() {
product.add("部件X");
}
@Override
public void builderPartB() {
product.add("部件Y");
}
@Override
public Product getProduct() {
return product;
}
}
package h.l.demo.builder;
/**
*
* @author: Is-Me-Hl
* @date: 2020年2月25日
* @Description: 具体建造者类2
*/
public class ConcreteBuilder2 extends Builder {
private Product product = new Product();
@Override
public void builderPartA() {
product.add("部件XX");
}
@Override
public void builderPartB() {
product.add("部件YY");
}
@Override
public Product getProduct() {
return product;
}
}
指挥者类:负责接收具体类实例,根据具体类创建对应的产品。
package h.l.demo.builder;
/**
*
* @author: Is-Me-Hl
* @date: 2020年2月25日
* @Description: 指挥者类
*/
public class Director {
public void Construct(Builder builder) {
builder.builderPartA();
builder.builderPartB();
}
}
测试类:
package h.l.demo.builder;
/**
*
* @author: Is-Me-Hl
* @date: 2020年2月14日
* @Description: 测试
*/
public class TestMainEnter {
public static void main(String[] args) {
Director director = new Director();
ConcreteBuilder1 concreteBuilder1 = new ConcreteBuilder1();
director.Construct(concreteBuilder1);
Product p1 = concreteBuilder1.getProduct();
p1.show();
System.out.println("---------------------");
ConcreteBuilder2 concreteBuilder2 = new ConcreteBuilder2();
director.Construct(concreteBuilder2);
Product p2 = concreteBuilder2.getProduct();
p2.show();
}
}
测试结果:
后分析
- 个人建议:写代码是件幸福的事,So,do it
建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程过程可以创建不同的表示。这里的表示可以理解为实例。分析上面的Demo,可以清晰看出:Product类是最终要生产的产品类,抽象类Builder定义了一组创建Product对象的各个部件指定的抽象接口,ConcreteBuilder1和ConcreteBuilder2是具体建造者,最后Director类,是指挥者类,根据用户的需求生产产品。那具体什么时候使用建造者模式呢?在创建一些复杂的对象,这些对象内部构建间的顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化。也就是说建造者模式是在当创复杂对象的算法应该独立于该对象的组成部分以及他们的装配方式时使用。
通俗讲,就是客户需要一个很复杂的对象,那么好,我最终会给你一个按照你期望的具有一定结构,一定顺序的对象。但是哪个具体的建造者按照指定的顺序及结构创建的,客户是不需要知道的。你只管要,我负责给就好,中间过程你也别问。
注:以上文章仅是个人总结,若有不当之处,望不吝赐教