上一篇:抽象工厂模式
1.什么是建造者模式?
将一个复杂对象的构建和表示分离开,使得同样的构建可以创建不同的表示。整不明白?
你就想象一下你点外卖的时候有不同的套餐:可乐+炸鸡=套餐A,可乐+薯条=套餐B。套餐A和套餐B是两个不同的表示,它的构建就是可乐、炸鸡、薯条这些子对象,这些子对象是不变的,但是能够通过不同的组合生成不同的套餐。
还没有懂?
造房子!造房子你用的原材料无非就是钢筋、水泥之类的材料(构建子对象),但是最终造出来的房子(表示)却是不一样的。
2.建造者模式的作用?
建造者模式用来隐藏复杂对象的实现细节,将复杂对象的创建进行抽象化,通过子类继承和重载的方式动态创建复杂对象。3.如何使用建造者模式?
1)定义房子类
/**
* 定义 房子类
*/
public class House {
/**
* 钢筋
*/
private String rebar;
/**
* 水泥
*/
private String cement;
public String getRebar() {
return rebar;
}
public void setRebar(String rebar) {
this.rebar = rebar;
}
public String getCement() {
return cement;
}
public void setCement(String cement) {
this.cement = cement;
}
@Override
public String toString() {
return "House{" +
"rebar='" + rebar + '\'' +
", cement='" + cement + '\'' +
'}';
}
}
2)定义建造者接口(工人)
/**
* 定义建造者(工人)
*/
public interface HouseBuilder {
/**
* 加钢筋
*/
public void addRebar();
/**
* 加水泥
*/
public void addCement();
/**
* 获取房子对象
*/
public House getHouse();
}
3)定义造高楼的施工队
/**
* 定义造高楼施工队类
*/
public class TallBuilder implements HouseBuilder {
House house = new House();
@Override
public void addRebar() {
house.setRebar("高楼---专用钢筋");
}
@Override
public void addCement() {
house.setCement("高楼---专用水泥");
}
@Override
public House getHouse() {
return house;
}
}
4)定义工地总指挥
建造者模式
与工厂模式
的区别就在于:建造者模式
更加专注于零件的装配顺序(先加钢筋还是先加水泥)。这里的工地总指挥类
就是用来定义零件装配顺序的,总指挥让你先加水泥就先加水泥,先放钢筋就先放钢筋。
/**
* 定义 指挥者 类
*/
public class Directer {
public House build(HouseBuilder houseBuilder) {
//加钢筋
houseBuilder.addRebar();
//加水泥
houseBuilder.addCement();
//返回一个hosue对象
House house = houseBuilder.getHouse();
return house;
}
}
5)编写测试类
/**
* 测试类
*/
public class Test {
public static void main(String[] args) {
//1.先new一个工地总指挥
Directer directer = new Directer();
//2.工地总指挥让修高楼(高楼施工队开始造房子)
House tallHouse = directer.build(new TallBuilder());
//3.打印输出
System.out.println(tallHouse);
System.out.println("========================");
//4.工地总指挥让修矮楼(矮楼施工队开始造房子)
House shortHouse = directer.build(new ShortBuilder());
//打印输出
System.out.println(shortHouse);
}
}
5)打印输出结果
看到测试类的时候,大家应该就已经知道建造者模式
和我们普通获取对象的方式的区别了,要是普通方式,我们会直接在main()
方法中new 一个house
对象,然后给它set
值。而现在我们使用建造者模式
时反正还是用钢筋水泥,但是最终的成品却不一样。
3.建造者模式的优越点?
1)优点:
具体的建造者是相互独立的(矮楼施工队、高楼施工队),便于横向扩展(再加个别墅施工队就直接添加新的实现类就行了)。
2)缺点:
此种模式所创建的产品一般都有很多的相同点,如果不同点太多,则此种模式就不适用了,其使用范围受到一定的限制。
如果产品的内部变化很大,则可能需要定义很多的建造者类来实现这种变化,可能导致系统过于庞大。