建造者模式的适用范围:
1、需要生成的产品对象有复杂的内部结构,而且这些对象具备共性
举例:比如房子要装修,总共要装修的有厨房,客厅,厕所,窗户等,这些就是复杂的内部结构,具备共性的意思是,我可以只装修厨房和窗户,其他不装修,这是一个排列组合问题,如果使用构造器的话,就会产生大量的代码冗余,于是使用建造者模式
2、隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品
通过.build 方法创建想要创建的东西
建造者模式的优点:
1、易与解耦
将产品本身与产品创建过程进行解耦,可以使用相同的创建过程来得到不同的产品。也就说细节依赖抽象
2、有益于精准控制对象的创建
将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰
3、有益于拓展
增加新的具体建造者无需修改原有类库的代码,易于拓展,符合“开闭原则“。
当然,建造者模式有一定的缺点:
1、建造者模式所创建的产品一般具有较多的共同点,其组成成分相似,如果产品之间的差异性很大,则不适合使用建造者模式,因此适用范围会有一定的限制
2、如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。
实现源码如下:
package demo12;
/**
* @Classname ContructorMode
* @Description
* @Date 2021/9/24 15:30
* @Created by thx
*/
public class ConstructorMode {
public static void main(String[] args) {
Director director = new Director();
House house = director.constructHouse(new HouseBuilder());
System.out.println(house.getBathRoom());
System.out.println(house.getKitchen());
System.out.println(house.getLivingRoom());
}
}
/**
* 建造者
*/
class Director {
public House constructHouse(IHouseBuilder builder) {
builder.buildBathRoom();
builder.buildKitchen();
builder.buildWindow();
builder.buildLivingRoom();
return builder.buildHouse();
}
}
/**
* 建房子接口
*/
interface IHouseBuilder {
void buildLivingRoom();
void buildWindow();
void buildKitchen();
void buildBathRoom();
House buildHouse();
}
/**
* 创建房子对象的类
*/
class HouseBuilder implements IHouseBuilder {
private House house;
public HouseBuilder() {
house = new House();
}
@Override
public void buildLivingRoom() {
house.setLivingRoom("客厅");
}
@Override
public void buildWindow() {
house.setWindow("窗户");
}
@Override
public void buildKitchen() {
house.setKitchen("厨房");
}
@Override
public void buildBathRoom() {
house.setBathRoom("卫生间");
}
@Override
public House buildHouse() {
return this.house;
}
}
/**
* 房子对象,提供 get set 方法
*/
class House {
private Object livingRoom;
private Object window;
private Object kitchen;
private Object bathRoom;
public Object getLivingRoom() {
return livingRoom;
}
public void setLivingRoom(Object livingRoom) {
this.livingRoom = livingRoom;
}
public Object getWindow() {
return window;
}
public void setWindow(Object window) {
this.window = window;
}
public Object getKitchen() {
return kitchen;
}
public void setKitchen(Object kitchen) {
this.kitchen = kitchen;
}
public Object getBathRoom() {
return bathRoom;
}
public void setBathRoom(Object bathRoom) {
this.bathRoom = bathRoom;
}
}