一,什么是建造者模式
Builder 模式又叫 建造者模式或者生成器模式。是由GoF 提出的23种设计模式中的一种。
Builder 模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,
通过子类继承和重载的方式,动态的创建具有复合属性的对象。
二,装饰模式的结构
抽象建造者(builder):描述具体建造者的公共接口,一般用来定义建造细节的方法,并不涉及具体的对象部件的创建。
具体建造者(ConcreteBuilder):描述具体建造者,并实现抽象建造者公共接口。
指挥者(Director):调用具体建造者来创建复杂对象(产品)的各个部分,并按照一定顺序(流程)来建造复杂对象。
产品(Product):描述一个由一系列部件组成较为复杂的对象。
三,应用场景,优点,缺点。
应用场景:对象的创建:Builder 模式是为对象的创建而设计的模式
创建的是一个复合对象:被创建的对象为了一个具有复合属性的复合对象
关注对象创建的各部分的创建过程:不同的工厂(这里指build生成器)对产品属性有不同的创建方法
优点:
1,产品的建造和表示分离,实现了解耦。
2,将复杂产品的创建步骤分解在不通过的方法中,使得创建过程更加清晰。
3,增加新的具体建造者无需修改原有了类库的代码,易于拓展,符合“开闭原则“。
缺点:
1、产品必须有共同点,限制了使用范围。
2、如内部变化复杂,会有很多的建造类,难以维护
四:代码实现:
1,产品:Product.java
public class House {
//地板
private String floor;
//墙
private String wall;
//屋顶
private String housetop;
public String getFloor() {
return floor;
}
public void setFloor(String floor) {
this.floor = floor;
}
public String getWall() {
return wall;
}
public void setWall(String wall) {
this.wall = wall;
}
public String getHousetop() {
return housetop;
}
public void setHousetop(String housetop) {
this.housetop = housetop;
}
}
2,建造者:Builder.java
public interface HouseBuilder {
//修地板
public void makeFloor();
//修墙
public void makeWall();
//修屋顶
public void makeHouseTop();
//返回对象
public House createHouse();
}
3,具体建造者:ConcreteBuilder.java
两个 不同的建造者
3.1
public class PingFangBuilder implements HouseBuilder {
House house = new House();
@Override
public void makeFloor() {
house.setFloor("平房");
}
@Override
public void makeWall() {
house.setWall("墙");
}
@Override
public void makeHouseTop() {
house.setHousetop("房顶");
}
@Override
public House createHouse() {
return house;
}
}
3.2
public class GongyuBuilder implements HouseBuilder{
House house = new House();
@Override
public void makeFloor() {
house.setFloor("别墅 ---》地板");
}
@Override
public void makeWall() {
house.setWall("别墅 ---》墙");
}
@Override
public void makeHouseTop() {
house.setHousetop("别墅 ---》屋顶");
}
@Override
public House createHouse() {
return house;
}
}
4.指挥者:Director.java
public class HouseDirector {
private HouseBuilder houseBuilder;
public HouseDirector(HouseBuilder houseBuilder) {
this.houseBuilder = houseBuilder;
}
public House makeHouse(){
houseBuilder.makeWall();
houseBuilder.makeHouseTop();
houseBuilder.makeFloor();
House house = houseBuilder.createHouse();
return house;
}
public HouseBuilder creBuilder(String type){
try {
Class houseBuilder = Class.forName(type);
return (HouseBuilder)houseBuilder.newInstance();
} catch (ClassNotFoundException e) {
e.printStackTrace();
System.out.println("找不到对象");
} catch (IllegalAccessException e) {
e.printStackTrace();
System.out.println("实例化错误");
} catch (InstantiationException e) {
e.printStackTrace();
System.out.println("非法访问异常");
}
return null;
}
}
测试:
public class Test {
public static void main(String[] args) {
/* House house = new House();
house.setFloor("地板");
house.setWall("墙");
house.setHousetop("屋顶");*/
HouseBuilder houseBuilder = new PingFangBuilder();
/*houseBuilder.makeHouseTop();
houseBuilder.makeWall();
houseBuilder.makeFloor();
House house = houseBuilder.createHouse();
System.out.println(house.getWall());
System.out.println(house.getHousetop());
System.out.println(house.getFloor());*/
HouseDirector houseDirector = new HouseDirector(houseBuilder);
House house = houseDirector.makeHouse();
System.out.println(house.getWall());
System.out.println(house.getHousetop());
System.out.println(house.getFloor());
}
}
五:总结
将复杂产品的具体属性 交给不同的 建造者去设计,指挥者 来具体的调用不同的建造者。 而我们只需要跟指挥者说 我要建造什么样的产品,指挥者就给我什么产品。 对产品的分离,实现解耦。使代码更加符合开闭原则,关闭修改,开放拓展。