一、模式示例
1.1、原理
1、什么是构建者模式:
- 建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。
2、介绍:
-
意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
-
主要解决:主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。
-
何时使用:一些基本部件不会变,而其组合经常变化的时候。
-
关键代码:建造者:创建和提供实例,导演:管理建造出来的实例的依赖关系。
-
应用实例:
1、去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐"。
2、JAVA 中的 StringBuilder。 -
优点:
1、建造者独立,易扩展。
2、便于控制细节风险。 -
缺点:
1、产品必须有共同点,范围有限制。
2、如内部变化复杂,会有很多的建造类。 -
使用场景:
1、需要生成的对象具有复杂的内部结构。
2、需要生成的对象内部属性本身相互依赖。 -
注意事项:与工厂模式的区别是;建造者模式更加关注与零件装配的顺序。
3、主要作用
- 在用户不知道对象的建造过程和细节的情况下就可以直接创建复杂的对象。
- 用户只需要给出指定复杂对象的类型和内容;
- 建造者模式负责按顺序创建复杂对象(把内部的建造过程和细节隐藏起来)
4、UML类图
5、需求分析
- 决策者:即工程师;决定什么类型的房子:公寓、别墅、城中村;向建造者发送指令
- 建造者接口:建造墙、建造屋顶、建造地板
- 具体建造者:继承自建造者接口,按照房子类型分为:公寓建造者、别墅建造者、城中村建造者
- 具体的产品:由具体建造者产出:包括公寓、别墅、城中村
1.2、代码示例
1、产品角色:房子
public class House {
//地板
private String floor;
//墙
private String wall;
//屋顶
private String roof;
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 getRoof() {
return roof;
}
@Override
public String toString() {
return "House{" +
"floor='" + floor + '\'' +
", wall='" + wall + '\'' +
", roof='" + roof + '\'' +
'}';
}
public void setRoof(String roof) {
this.roof = roof;
}
}
2、建造者接口:房屋建造
public interface HouseBuilder {
void doFloor();
void doWall();
void doRoof();
House getHouse();
}
3、具体建造者角色:公寓建造工程队;继承自建造者接口
public class ApartmentBuilder implements HouseBuilder{
House house = new House();
@Override
public void doFloor() {
house.setFloor("公寓:地板");
}
@Override
public void doWall() {
house.setWall("公寓:墙");
}
@Override
public void doRoof() {
house.setRoof("公寓:屋顶");
}
@Override
public House getHouse() {
return house;
}
}
4、具体建造者:别墅工程队;继承自建造者接口
public class VillaBuilder implements HouseBuilder{
House house = new House();
@Override
public void doFloor() {
house.setFloor("别墅:地板");
}
@Override
public void doWall() {
house.setWall("别墅:墙");
}
@Override
public void doRoof() {
house.setRoof("别墅:屋顶");
}
@Override
public House getHouse() {
return house;
}
}
5、具体建造者:城中村工程队;继承自建造者接口
public class VillageBuilder implements HouseBuilder{
House house = new House();
@Override
public void doFloor() {
house.setFloor("城中村:地板");
}
@Override
public void doWall() {
house.setWall("城中村:墙");
}
@Override
public void doRoof() {
house.setRoof("城中村:屋顶");
}
@Override
public House getHouse() {
return house;
}
}
6、决策者:工程师
public class HouseDirector {
public House buildHouse(HouseBuilder houseBuilder){
houseBuilder.doFloor();
houseBuilder.doRoof();
houseBuilder.doWall();
return houseBuilder.getHouse();
}
}
7、启动类
public class BuilderApplication {
public static void main(String[] args) {
HouseBuilder villaBuilder = new VillaBuilder();
HouseBuilder villageBuilder = new VillageBuilder();
HouseBuilder apartmentBuilder = new ApartmentBuilder();
HouseDirector villaDirector = new HouseDirector();
HouseDirector villageDirector = new HouseDirector();
HouseDirector apartmentDirector = new HouseDirector();
House villaHouse = villaDirector.buildHouse(villaBuilder);
House villageHouse = villageDirector.buildHouse(villageBuilder);
House apartmentHouse = apartmentDirector.buildHouse(apartmentBuilder);
System.out.println("villaHouse别墅 = " + villaHouse);
System.out.println("villageHouse城中村 = " + villageHouse);
System.out.println("apartmentHouse公寓 = " + apartmentHouse);
}
}