需求分析:
- 需要建房子:这一过程为打桩、砌墙、封顶
- 房子有各种各样的要求,比如普通房子,高楼,别墅,各种房子的过程虽然一样,但是要求不同
虽然各种房子的具体要求不同,但是大致的流程相似因此我们就可以将相似的部分抽取成一个接口或者一个抽象类;然后再由不同的具体实现类进行创建,这里推荐采用抽象类,如果是接口我们需要实现接口中的每一种方法,这就导致如果是建造别墅可能会由打造泳池这个操作,但是其他的房子并没有操作,所以我们其他的房子实现类是没有必要去实现这个过程的所以这里采用了抽象类进行实现;
按照我们的分工,我们是采用了HouseBuilder进行指挥者与建造者的隔离,这样就可以让指挥者创建不同的房子,同时在我们需要拓展的时候也仅仅需要继续创建一个实现类就好了;
这个过程其实真的有点类似于现实生活中的场景,每个人都有自己明确的分工,指挥者就相当于设计师,而HouseBuilder可以看作是一个建设局胡总和外包,具体的Builder是具体的项目负责团队,而你就是这个需求者,在这里我们称之为Client;
最终我们根据此种依赖关系传简最终的UML类图来设计我们的代码:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
我们最终的目标就是获取House这个产品;
创建者模式:
创建者模式又叫建造者模式,是将一个复杂的对象的构建与它的表示分离,使 得同样的构建过程可以创建不同的表示。创建者模式隐藏了复杂对象的创建过程,它把复杂对象的创建过程加以抽象,通过子类继承或者重载的方式,动态的创建具有复合属性的对象。
使用场景
隔离复杂对象的创建和使用,相同的方法,不同执行顺序,产生不同事件结果
多个部件都可以装配到一个对象中,但产生的运行结果不相同
产品类非常复杂或者产品类因为调用顺序不同而产生不同作用
初始化一个对象时,参数过多,或者很多参数具有默认值
Builder模式不适合创建差异性很大的产品类
产品内部变化复杂,会导致需要定义很多具体建造者类实现变化,增加项目中类的数量,增加系统的理解难度和运行成本
需要生成的产品对象有复杂的内部结构,这些产品对象具备共性;
主要作用
- 在用户不知道对象的建造过程和细节的情况下就可以直接创建复杂的对象。
- 用户只需要给出指定复杂对象的类型和内容;
- 建造者模式负责按顺序创建复杂对象(把内部的建造过程和细节隐藏起来)
例如:
- 工厂(建造者模式):负责制造汽车(组装过>程和细节在工厂内)
- 汽车购买者(用户):你只需要说出你需要的>型号(对象的类型和内容),然后直接购买就可>>以使用了
模式讲解:
- 指挥者(Director)直接和客户(Client)进行需求沟通;
- 沟通后指挥者将客户创建产品的需求划分为各个部件的建造请求(Builder);
- 将各个部件的建造请求委派到具体的建造者(ConcreteBuilder);
- 各个具体建造者负责进行产品部件的构建;
- 最终构建成具体产品(Product)。
那现在我们就开始创建我们的房子吧:
首先我们创建一个抽象类:
public abstract class HouseBuilder(){
private House house = new House();
public abstract void buildBasic();
public abstract void buildWalls();
public abstract void roofed();
public abstract House build();
}
CommonHouse:
public class CommonHouse extends HouseBuilder {
@Override
public void buildBasic() {
System.out.println("普通房子地基只需要两米即可");
}
@Override
public void buildWalls() {
System.out.println("采用白色墙体");
}
@Override
public void roofed() {
System.out.println("采用琉璃瓦进行封顶");
}
@Override
public House build() {
return new House();
}
@Override
public void createPool() {
System.out.println("此栋房子没有配备此种设置");
}
}
HighHouse:
public class HighBuilding extends HouseBuilder {
@Override
public void buildBasic() {
System.out.println("普通房子地基只需要50米即可");
}
@Override
public void buildWalls() {
System.out.println("采用玻璃墙体");
}
@Override
public void roofed() {
System.out.println("采用空中花园进行封顶");
}
@Override
public House build() {
return new House();
}
@Override
public void createPool() {
System.out.println("无边际泳池");
}
}
HouseDirect:
/**
* @author wyp867322
* @version 1.0
* @date 2020/7/6 1:13
*/
public class HouseDirector {
private HouseBuilder houseBuilder;
public HouseBuilder getHouseBuilder() {
return houseBuilder;
}
public void setHouseBuilder(HouseBuilder houseBuilder) {
this.houseBuilder = houseBuilder;
}
public House createHouse(){
houseBuilder.buildBasic();
houseBuilder.buildWalls();
houseBuilder.roofed();
return houseBuilder.build();
}
}
Client:
public class Client {
public static void main(String[] args) {
HouseDirector houseDirector = new HouseDirector();
HouseBuilder houseBuilder = new CommonHouse();
houseDirector.setHouseBuilder(houseBuilder);
House house = houseDirector.createHouse();
System.out.println(house);
}
}
结合图像来看,具体的建造细节(每一步需要做什么)由实体类完成,指挥者仅仅安排建造的过程(不同的房子需要怎么做)最终在指挥者这里获得成品提供给需求者完成创建;
}
}
```mermaid
graph LR
A[普通住房]-->B[共同特征]
C[高楼大厦]-->B
D[别墅]-->B
B-->E[指挥者]
E-->|成品|F[需求者]
G[成品]-->E
结合图像来看,具体的建造细节(每一步需要做什么)由实体类完成,指挥者仅仅安排建造的过程(不同的房子需要怎么做)最终在指挥者这里获得成品提供给需求者完成创建;